diff --git a/.github/README.md b/.github/README.md new file mode 100644 index 000000000..21dd484f1 --- /dev/null +++ b/.github/README.md @@ -0,0 +1,17 @@ +# Python Versions + +Edit `py-versions.json` to modify which versions of Python releases are generated for and under +which versions unit tests run. + +- Supported versions - These are the primary versions of Python that Pavilion supports, and the + versions under which the core unit tests run. +- Legacy versions - These are versions of Python that are no longer fully supported and may be end- + of-life, but which Pavilion must still support for one reason or another. Unit tests run under + legacy versions of Python necessarily run in containers in GitHub CI. +- Default version - For unit tests that don't need to run under multiple Python versions, this is + the version of Python under which those unit tests run. Ideally, the default version should + be among the supported versions. + +For each version, a compatible OS must be specified. This controls the OS of the virtual machine +on which unit tests for that version of Python run. Typically, this is the latest version of +Ubuntu with which that version of Python is compatible. \ No newline at end of file diff --git a/.github/py-versions.json b/.github/py-versions.json new file mode 100644 index 000000000..be26adaff --- /dev/null +++ b/.github/py-versions.json @@ -0,0 +1,12 @@ +{ + "supported_py_versions": [ + { "python": "3.10", "os": "ubuntu-latest" }, + { "python": "3.12", "os": "ubuntu-latest" } + ], + "legacy_py_versions": [ + { "python": "3.6", "os": "ubuntu-latest" } + ], + "default_py_version": { + "python": "3.10", "os": "ubuntu-latest" + } +} \ No newline at end of file diff --git a/.github/workflows/coverage.yml b/.github/workflows/coverage.yml index 7ae89c220..14aee3130 100644 --- a/.github/workflows/coverage.yml +++ b/.github/workflows/coverage.yml @@ -5,6 +5,9 @@ on: # Run at midnight on Sundays - cron: "0 0 * * 0" +permissions: + contents: read + jobs: coverage: runs-on: ubuntu-latest @@ -22,8 +25,8 @@ jobs: - name: Install dependencies run: | python -m pip install --upgrade pip - pip install -r requirements.txt - pip install -r test/requirements.txt + pip install -r requirements/base-py312-lock.txt + pip install -r requirements/test-py312-lock.txt pip install "coverage>=7.10,<8" - name: setup diff --git a/.github/workflows/demo.yml b/.github/workflows/demo.yml index 86004f69c..88b462cf0 100644 --- a/.github/workflows/demo.yml +++ b/.github/workflows/demo.yml @@ -10,6 +10,9 @@ on: - develop - stable +permissions: + contents: read + jobs: demo_runs: # Check to make sure Pavilion can auto-fetch it's dependencies. @@ -23,10 +26,16 @@ jobs: with: python-version: "3.10" - - name: install-deps + - name: Install Python dependencies + run: | + pip install -r requirements/base-py310-lock.txt + pip install -r requirements/test-py310-lock.txt + pip install -r requirements/docs-py310-lock.txt + + - name: Install GCC run: sudo apt install gcc - - name: + - name: Run demo tests run: | source examples/demo/activate.sh pav run -v QUIET demo advanced buildit diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml new file mode 100644 index 000000000..9e287e070 --- /dev/null +++ b/.github/workflows/release.yml @@ -0,0 +1,300 @@ +name: Build and Release Pavilion + +on: + push: + branches: + - hwikle/offline-release-ci + tags: + - "v*" + workflow_dispatch: + +env: + PACKAGE_NAME: "pavilion" + +jobs: + test-standard: + name: Test standard install for Python ${{ matrix.python-version }} + runs-on: ubuntu-latest + + permissions: + contents: read + + strategy: + matrix: + python-version: ["3.10", "3.12"] + + steps: + - name: Check out Pavilion repository + uses: actions/checkout@v4 + + - name: Set up Python + uses: actions/setup-python@v5 + with: + python-version: ${{ matrix.python-version }} + + - name: Upgrade packaging tools + run: | + python -m pip install --upgrade pip setuptools wheel + + - name: Install dependencies from lock file + run: | + PY_TAG="py${{ matrix.python-version }}" + PY_TAG="${PY_TAG/./}" + pip install requirements/base-py$"${PY_TAG}"-lock.txt + pip install requirements/test-py$"${PY_TAG}"-lock.txt + pip install requirements/docs-py$"${PY_TAG}"-lock.txt + + - name: Setup Pavilion application-level config + run: | + ln -s pavilion.yaml.ci test/data/pav_config_dir/pavilion.yaml + echo "working_dir: $(pwd)/test/working_dir" >> test/data/pav_config_dir/pavilion.yaml + + - name: Run Pavilion unit tests + run: | + ./test/run_tests + + build-wheelhouse: + name: Build offline wheelhouse artifact for Python ${{ matrix.python-version }} + runs-on: ubuntu-latest + needs: test-standard + + permissions: + contents: read + + strategy: + matrix: + python-version: ["3.10", "3.12"] + + steps: + - name: Check out Pavilion repository + uses: actions/checkout@v4 + + - name: Set up Python + uses: actions/setup-python@v5 + with: + python-version: ${{ matrix.python-version }} + + - name: Upgrade packaging tools + run: | + python -m pip install --upgrade pip setuptools wheel + + - name: Create wheelhouse + run: | + PY_TAG="py${{ matrix.python-version }}" + PY_TAG="${PY_TAG/./}" + rm -rf dist wheelhouse release-offline + mkdir -p wheelhouse + python -m pip download \ + --requirement requirements/{base,test,docs}-py"${PY_TAG}"-lock.txt \ + --dest wheelhouse + + - name: Build offline release tree + run: | + VERSION="${GITHUB_REF_NAME:-dev}" + ROOT="release-offline/${PACKAGE_NAME}-offline-${VERSION}" + + mkdir -p "${ROOT}" + + rsync -a \ + --exclude ".git" \ + --exclude ".github" \ + --exclude "__pycache__" \ + --exclude ".pytest_cache" \ + --exclude "dist" \ + --exclude "release-offline" \ + ./ "${ROOT}/" + + cp -r wheelhouse "${ROOT}/wheelhouse" + + cat > "${ROOT}/install_offline.sh" <<'EOF' + #!/usr/bin/env bash + set -euo pipefail + + ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" + VENV="${1:-$ROOT/.venv}" + + python3 -m venv "$VENV" + # shellcheck disable=SC1091 + source "$VENV/bin/activate" + + python -m pip install --upgrade pip + python -m pip install \ + --no-index \ + --find-links "$ROOT/wheelhouse" \ + -r "$ROOT/requirements-lock.txt" + + cat < "${ROOT}/README.offline.md" <<'EOF' + # Pavilion Offline Install + + This bundle includes a wheelhouse for offline dependency installation. + + ## Install + + ```bash + ./install_offline.sh + ``` + + Or choose a custom virtualenv location: + + ```bash + ./install_offline.sh /path/to/venv + ``` + + ## Notes + + - Installation uses only the bundled `wheelhouse/` + - No package index access is required + - Pavilion itself runs from this source tree + EOF + + cat > "${ROOT}/build-metadata.json" <> test/data/pav_config_dir/pavilion.yaml - #echo "spack_path: $(pwd)/test/spack" >> test/data/pav_config_dir/pavilion.yaml - #./test/utils/spack_setup test - - # Set run_tests to run only the specific tests you need to fix. - - name: run_tests - env: - COLUMNS: 120 - LINES: 40 - run: | - ./test/run_tests + outputs: + supported_py_versions: ${{ steps.load-py-versions.outputs.supported_py_versions }} + legacy_py_versions: ${{ steps.load-py-versions.outputs.legacy_py_versions }} + default_py_version: ${{steps.load-py-versions.outputs.default_py_version}} - - name: zip_working_dir - if: always() - run: | - # If we don't zip this ourselves, it will run infinitely due to - # symlink loops. - cd test - ./utils/make_symlinks_relative working_dir - zip -yr working_dir.zip working_dir + steps: + - name: Checkout Pavilion repository + uses: actions/checkout@v4 - - name: logs - if: always() - uses: actions/upload-artifact@v4 - with: - name: test_output - path: test/working_dir.zip + - name: Load Python version matrix + id: load-py-versions + run: | + echo "supported_py_versions=$(jq -c '.supported_py_versions' .github/py-versions.json)" >> "$GITHUB_OUTPUT" + echo "legacy_py_versions=$(jq -c '.legacy_py_versions' .github/py-versions.json)" >> "$GITHUB_OUTPUT" + echo "default_py_version=$(jq -c '.default_py_version' .github/py-versions.json)" >> "$GITHUB_OUTPUT" + cat "$GITHUB_OUTPUT" style: - runs-on: ubuntu-latest + name: Run style checks + runs-on: ${{ fromJson(needs.load-python-versions.outputs.default_py_version.os) }} + needs: load-python-versions steps: - - uses: actions/checkout@v4 + - name: Checkout Pavilion repository + uses: actions/checkout@v4 with: submodules: recursive - - name: Set up Python 3.9 + + - name: Setup Python ${{ fromJson(needs.load-python-versions.outputs.default_py_version.python) }} uses: actions/setup-python@v5 with: - python-version: "3.9" + python-version: ${{ fromJson(needs.load-python-versions.outputs.default_py_version.python) }} + + - name: Compute py_tag + id: py_tag + shell: bash + run: | + PY_TAG="py${{ fromJson(needs.load-python-versions.outputs.default_py_version.python) }}" + PY_TAG="${PY_TAG/./}" + echo "py_tag=${PY_TAG}" >> "$GITHUB_OUTPUT" - name: Install dependencies run: | python -m pip install --upgrade pip - pip install -r requirements.txt - pip install -r test/requirements.txt - pip install -r docs/requirements.txt - - name: setup + for dep_type in $DEPENDENCY_TYPES; do + pip install -r requirements/${dep_type}-${{ steps.py_tag.outputs.py_tag }}-lock.txt + done + + - name: Setup Pavilion application-level config run: | ln -s pavilion.yaml.ci test/data/pav_config_dir/pavilion.yaml echo "working_dir: $(pwd)/test/working_dir" >> test/data/pav_config_dir/pavilion.yaml echo "spack_path: $(pwd)/test/spack" >> test/data/pav_config_dir/pavilion.yaml - - name: run_tests + - name: Run style tests run: | sudo -E su $USER -c "PATH=$PATH; ./test/run_tests -q -o style -o debug_prints" docs: - runs-on: ubuntu-latest + name: Run documentation checks + runs-on: ${{ fromJson(needs.load-python-versions.outputs.default_py_version.os) }} + needs: load-python-versions steps: - - uses: actions/checkout@v4 + - name: Checkout Pavilion repository + uses: actions/checkout@v4 with: submodules: recursive - - name: Set up Python 3.10 + + - name: Setup Python ${{ fromJson(needs.load-python-versions.outputs.default_py_version.python) }} uses: actions/setup-python@v5 with: - python-version: "3.10" + python-version: "${{ fromJson(needs.load-python-versions.outputs.default_py_version.python) }}" + + - name: Compute py_tag + id: py_tag + shell: bash + run: | + PY_TAG="py${{ fromJson(needs.load-python-versions.outputs.default_py_version.python) }}" + PY_TAG="${PY_TAG/./}" + echo "py_tag=${PY_TAG}" >> "$GITHUB_OUTPUT" - name: Install dependencies run: | - pip install -r requirements.txt - pip install -r test/requirements.txt - pip install -r docs/requirements.txt + for dep_type in $DEPENDENCY_TYPES; do + pip install -r requirements/${dep_type}-${{ steps.py_tag.outputs.py_tag }}-lock.txt + done - - name: setup + - name: Setup Pavilion application-level config run: | ln -s pavilion.yaml.ci test/data/pav_config_dir/pavilion.yaml echo "working_dir: $(pwd)/test/working_dir" >> test/data/pav_config_dir/pavilion.yaml echo "spack_path: $(pwd)/test/spack" >> test/data/pav_config_dir/pavilion.yaml - - name: run_tests + - name: Run documentation tests run: ./test/run_tests -o 'doc*' -q - unittests-3_7: - runs-on: ubuntu-22.04 + unittests-modern-python: + name: Run unit tests on Python ${{ matrix.python }} + runs-on: ${{ matrix.os }} needs: + - load-python-versions - style - docs + strategy: + matrix: + include: ${{ fromJson(needs.load-python-versions.outputs.supported_py_versions) }} + steps: - - uses: actions/checkout@v4 + - name: Checkout Pavilion repository + uses: actions/checkout@v4 with: submodules: recursive - - name: Set up Python 3.7 + - name: Setup Python ${{ matrix.python }} uses: actions/setup-python@v5 with: - python-version: 3.7 + python-version: "${{ matrix.python }}" - - name: Install dependencies + - name: Compute py_tag + id: py_tag + shell: bash run: | - python -m pip install --upgrade pip - pip install -r requirements.txt - pip install -r test/requirements.txt - pip install -r docs/requirements.txt - sphinx-build --version - pylint --version - - - name: setup - run: | - ln -s pavilion.yaml.ci test/data/pav_config_dir/pavilion.yaml - echo "working_dir: $(pwd)/test/working_dir" >> test/data/pav_config_dir/pavilion.yaml - echo "spack_path: $(pwd)/test/spack" >> test/data/pav_config_dir/pavilion.yaml - ./test/utils/spack_setup test - - - name: run_tests - run: | - ./test/run_tests - - - name: zip_working_dir - if: failure() - run: | - # If we don't zip this ourselves, it will run infinitely due to - # symlink loops. - cd test - ./utils/make_symlinks_relative working_dir - zip -yr working_dir.zip working_dir - - - name: logs - if: failure() - uses: actions/upload-artifact@v4 - with: - name: test_output_2.6 - path: test/working_dir.zip - - unittests-3_10: - runs-on: ubuntu-latest - needs: - - style - - docs - - steps: - - uses: actions/checkout@v4 - with: - submodules: recursive - - - name: Set up Python 3.10 - uses: actions/setup-python@v5 - with: - python-version: "3.10" + PY_TAG="py${{ matrix.python }}" + PY_TAG="${PY_TAG/./}" + echo "py_tag=${PY_TAG}" >> "$GITHUB_OUTPUT" - name: Install dependencies run: | python -m pip install --upgrade pip - pip install -r requirements.txt - pip install -r test/requirements.txt - pip install -r docs/requirements.txt - - name: setup + for dep_type in $DEPENDENCY_TYPES; do + pip install -r requirements/${dep_type}-${{ steps.py_tag.outputs.py_tag }}-lock.txt + done + + - name: Setup Pavilion application-level config run: | ln -s pavilion.yaml.ci test/data/pav_config_dir/pavilion.yaml echo "working_dir: $(pwd)/test/working_dir" >> test/data/pav_config_dir/pavilion.yaml echo "spack_path: $(pwd)/test/spack" >> test/data/pav_config_dir/pavilion.yaml ./test/utils/spack_setup test - - name: run_tests + - name: Run unit tests run: | sudo -E su $USER -c "PATH=$PATH; ./test/run_tests" - - name: zip_working_dir + - name: Zip working directory if: failure() run: | # If we don't zip this ourselves, it will run infinitely due to @@ -216,48 +178,73 @@ jobs: ./utils/make_symlinks_relative working_dir zip -yr working_dir.zip working_dir - - name: logs + - name: Upload working directory if: failure() uses: actions/upload-artifact@v4 with: - name: test_output_2.10 + name: working_dir_${{ steps.py_tag.outputs.py_tag }} path: test/working_dir.zip - unittests-3_12: - runs-on: ubuntu-latest + unittests-legacy-python: + # We run this as a separate job because older versions of Python which are no longer supported + # by GitHub, for the `setup-python` action, will still work in containers. + name: Run unit tests on Python ${{ matrix.python }} (containerized) + runs-on: ${{ matrix.os }} + container: python:${{ matrix.python }} needs: - - style - - docs + - load-python-versions + - style + - docs + + strategy: + matrix: + include: ${{ fromJson(needs.load-python-versions.outputs.legacy_py_versions) }} steps: - - uses: actions/checkout@v4 + - name: Check Python version + run: | + PY_VERSION=$(python -c "import sys; print(f'{sys.version_info.major}.{sys.version_info.minor}')") + test "$PY_VERSION" = ${{ matrix.python }} + + - name: Checkout Pavilion repository + uses: actions/checkout@v4 with: submodules: recursive - - name: Set up Python 3.12 - uses: actions/setup-python@v5 - with: - python-version: "3.12" + - name: Compute py_tag + id: py_tag + shell: bash + run: | + PY_TAG="py${{ matrix.python }}" + PY_TAG="${PY_TAG/./}" + echo "py_tag=${PY_TAG}" >> "$GITHUB_OUTPUT" - name: Install dependencies run: | python -m pip install --upgrade pip - pip install -r requirements.txt - pip install -r test/requirements.txt - pip install -r docs/requirements.txt - - name: setup + for dep_type in $DEPENDENCY_TYPES; do + pip install -r requirements/${dep_type}-${{ steps.py_tag.outputs.py_tag }}-lock.txt + done + + - name: Setup Pavilion application-level config run: | ln -s pavilion.yaml.ci test/data/pav_config_dir/pavilion.yaml echo "working_dir: $(pwd)/test/working_dir" >> test/data/pav_config_dir/pavilion.yaml echo "spack_path: $(pwd)/test/spack" >> test/data/pav_config_dir/pavilion.yaml ./test/utils/spack_setup test - - name: run_tests + - name: Run unit tests run: | - sudo -E su $USER -c "PATH=$PATH; ./test/run_tests" + ./test/run_tests - - name: zip_working_dir + - name: Install zip + if: failure() + run: | + apt-get update + apt-get install -y zip + + - name: Zip working directory if: failure() run: | # If we don't zip this ourselves, it will run infinitely due to @@ -266,9 +253,9 @@ jobs: ./utils/make_symlinks_relative working_dir zip -yr working_dir.zip working_dir - - name: logs + - name: Upload working directory if: failure() uses: actions/upload-artifact@v4 with: - name: test_output_2.10 - path: test/working_dir.zip \ No newline at end of file + name: working_dir_${{ steps.py_tag.outputs.py_tag }} + path: test/working_dir.zip diff --git a/.github/workflows/update-dependencies.yml b/.github/workflows/update-dependencies.yml new file mode 100644 index 000000000..f0432e0b8 --- /dev/null +++ b/.github/workflows/update-dependencies.yml @@ -0,0 +1,277 @@ +name: Update Python dependencies + +on: + # The on.push trigger is present only for ease of testing. It should be removed before this + # workflow is merged into develop. + push: + branches: + - 'hwikle/offline-release-ci' + workflow_dispatch: + inputs: + base_branch: + description: "Branch against which to open the PR" + required: false + default: "" + type: string + +env: + # BASE_BRANCH: ${{ inputs.base_branch != '' && inputs.base_branch || github.event.repository.default_branch }} + # This default is present only for ease of testing. It should be removed and replaced with the above line + # before this workflow is merged into develop. + BASE_BRANCH: ${{ inputs.base_branch != '' && inputs.base_branch || 'hwikle/offline-release-ci' }} + +defaults: + run: + shell: bash + +jobs: + load-python-versions: + name: Load Python versions + runs-on: ubuntu-latest + + permissions: + contents: read + + outputs: + supported_py_versions: ${{ steps.load-py-versions.outputs.supported_py_versions }} + legacy_py_versions: ${{ steps.load-py-versions.outputs.legacy_py_versions }} + default_py_version: ${{steps.load-py-versions.outputs.default_py_version}} + + steps: + - name: Checkout Pavilion repository + uses: actions/checkout@v4 + + - name: Load Python version matrix + id: load-py-versions + run: | + echo "supported_py_versions=$(jq -c '.supported_py_versions' .github/py-versions.json)" >> "$GITHUB_OUTPUT" + echo "legacy_py_versions=$(jq -c '.legacy_py_versions' .github/py-versions.json)" >> "$GITHUB_OUTPUT" + echo "default_py_version=$(jq -c '.default_py_version' .github/py-versions.json)" >> "$GITHUB_OUTPUT" + cat "$GITHUB_OUTPUT" + + discover-requirements-groups: + name: Discover requirements groups + runs-on: ubuntu-latest + + permissions: + contents: read + + outputs: + requirements-groups: ${{ steps.groups.outputs.requirements-groups }} + + steps: + - name: Checkout Pavilion repository + uses: actions/checkout@v4 + + - name: Find *.in files + id: groups + run: | + groups=$(find requirements -type f -name "*.in" -print | xargs basename -s .in) + json=$(echo $groups | jq -R -s -c 'split("\n")[:-1]') + echo "requirements-groups=$json" >> "$GITHUB_OUTPUT" + + update-lockfiles-modern-python: + name: Regenerate lockfiles for Python ${{ matrix.python }} + runs-on: ${{ matrix.os }} + needs: + - load-python-versions + - discover-requirements-groups + + permissions: + contents: read + + strategy: + matrix: + include: ${{ fromJson(needs.load-python-versions.outputs.supported_py_versions) }} + + steps: + - name: Check out Pavilion repository + uses: actions/checkout@v6 + with: + ref: ${{ env.BASE_BRANCH }} + + - name: Set up Python + uses: actions/setup-python@v6 + with: + python-version: ${{ matrix.python }} + + - name: Compute py_tag + id: py_tag + run: | + PY_TAG="py${{ matrix.python }}" + PY_TAG="${PY_TAG/./}" + echo "py_tag=${PY_TAG}" >> "$GITHUB_OUTPUT" + + - name: Install dev dependencies + run: | + python -m pip install --upgrade pip + python -m pip install -r requirements/dev-py${{ steps.py_tag.outputs.py_tag }}-lock.txt || python -m pip install -r requirements/dev.in + + - name: Regenerate lockfiles + # There's a possibility of inconsistencies here between the test and runtime environments + # if each requires a different version of the same transitive dependency. It's unlikely, + # but we should think about using a tool like Poetry that supports a single lockfile + # with multiple dependency groups. + run: | + for dep_type in $(${{ needs.discover-requirements-groups.outputs.requirements-groups }} | jq -r '.[]'); do + python -m piptools compile \ + --upgrade \ + --generate-hashes \ + --no-strip-extras \ + --output-file "requirements/${dep_type}-${{ steps.py_tag.outputs.py_tag }}-lock.txt" \ + requirements/${dep_type}.in + done + + - name: Check for inconsistencies between environments + # For now we'll just issue a warning, and not fail, if inconsistencies are found. + run: python dev-utils/check_inconsistent_deps.py "requirements/*-${{ steps.py_tag.outputs.py_tag }}-lock.txt" + + - name: Upload generated lockfiles + uses: actions/upload-artifact@v6 + with: + name: lockfiles-${{ steps.py_tag.outputs.py_tag }} + path: requirements/*-${{ steps.py_tag.outputs.py_tag}}-lock.txt + + update-lockfiles-legacy-python: + name: Regenerate lockfiles for Python ${{ matrix.python }} + runs-on: ${{ matrix.os }} + container: python:${{ matrix.python }} + needs: + - load-python-versions + - discover-requirements-groups + + permissions: + contents: + read + + strategy: + matrix: + include: ${{ fromJson(needs.load-python-versions.outputs.legacy_py_versions) }} + + steps: + - name: Checkout Pavilion repository + uses: actions/checkout@v6 + with: + ref: ${{ env.BASE_BRANCH }} + + - name: Compute py_tag + id: py_tag + run: | + PY_TAG="py${{ matrix.python }}" + PY_TAG="${PY_TAG/./}" + echo "py_tag=${PY_TAG}" >> "$GITHUB_OUTPUT" + + - name: Remove minimum version from coverage + # The features we need from coverage don't exist before version 7.10, but it doesn't + # really matter since we only run coverage under newer versions of Python. + run: sed -i 's/coverage>=7.10/coverage/' requirements/dev.in + + - name: Install dev dependencies + run: | + python -m pip install --upgrade pip + python -m pip install -r requirements/dev-py${{ steps.py_tag.outputs.py_tag }}-lock.txt || python -m pip install -r requirements/dev.in + + - name: Regenerate lockfiles + # There's a possibility of inconsistencies here between the test and runtime environments + # if each requires a different version of the same transitive dependency. It's unlikely, + # but we should think about using a tool like Poetry that supports a single lockfile + # with multiple dependency groups. + run: | + for dep_type in $(${{ needs.discover-requirements-groups.outputs.requirements-groups }} | jq -r '.[]'); do + python -m piptools compile \ + --upgrade \ + --generate-hashes \ + --output-file "requirements/${dep_type}-${{ steps.py_tag.outputs.py_tag }}-lock.txt" \ + "requirements/${dep_type}.in" + done + + - name: Check for inconsistencies between environments + # For now we'll just issue a warning, and not fail, if inconsistencies are found. + run: | + python .github/utils/check_inconsistent_deps.py "requirements/*-${{ steps.py_tag.outputs.py_tag }}-lock.txt" + + - name: Upload generated lockfiles + uses: actions/upload-artifact@v6 + with: + name: lockfiles-${{ steps.py_tag.outputs.py_tag }} + path: requirements/*-${{ steps.py_tag.outputs.py_tag }}-lock.txt + + create-pr: + name: Commit updated lockfiles and open PR + runs-on: ubuntu-latest + needs: + - update-lockfiles-modern-python + - update-lockfiles-legacy-python + + permissions: + contents: read + pull-requests: write + + steps: + - name: Check out Pavilion repository + uses: actions/checkout@v6 + with: + ref: ${{ github.head_ref || github.ref_name }} + + - name: Remove old lockfiles + run: | + git rm requirements/*-py*-lock.txt + + - name: Download lockfiles + uses: actions/download-artifact@v6 + with: + pattern: lockfiles-py* + path: requirements + merge-multiple: true + + - name: Stage new lockfiles + run: | + git add requirements/*-py*-lock.txt + + - name: Collect git status output + id: pr-changes + run: | + { + echo 'inputs<> "$GITHUB_OUTPUT" + { + echo 'modified<> "$GITHUB_OUTPUT" + { + echo 'deleted<> "$GITHUB_OUTPUT" + + - name: Create pull request + uses: peter-evans/create-pull-request@v8 + with: + base: ${{ env.BASE_BRANCH }} + branch: ci/update-python-dependencies + commit-message: "Update Python dependency lockfiles" + title: "Update Python dependency lockfiles" + body: | + This PR regenerates the Python dependency lockfiles from: + + ${{ steps.pr-changes.outputs.inputs}} + + ${{ steps.pr-changes.outputs.added != '' && format('New files:\n{0}\n', steps.pr-changes.outputs.added) || '' }} + + ${{ steps.pr-changes.outputs.modified != '' && format('Updated files:\n{0}\n', steps.pr-changes.outputs.modified) || '' }} + + ${{ steps.pr-changes.outputs.deleted != '' && format('Deleted files:\n{0}\n', steps.pr-changes.outputs.deleted) || '' }} + + These lockfiles are generated automatically with `pip-compile --upgrade --generate-hashes`. + + **This PR was generated automatically by the `update-dependencies` workflow. Please + review if carefully.** + delete-branch: true \ No newline at end of file diff --git a/dev-utils/check_inconsistent_deps.py b/dev-utils/check_inconsistent_deps.py new file mode 100644 index 000000000..c3a1e054b --- /dev/null +++ b/dev-utils/check_inconsistent_deps.py @@ -0,0 +1,164 @@ +"""Identify inconsistencies in dependency versions between environments, given a set of lockfiles. +""" +import sys +from argparse import ArgumentParser +from pathlib import Path +from collections import defaultdict +from packaging.requirements import Requirement +from packaging.utils import canonicalize_name +from typing import TextIO, Dict, Tuple, List + + +def main() -> int: + parser = _setup_parser() + args = parser.parse_args() + + lockfiles = [f for p in args.lockfiles for f in Path().glob(p)] + + if len(lockfiles) < 2: + print("check_inconsistent_deps expects at least two lockfiles, but only " + " {len(args.lockfiles)} was/were provided.",file=sys.stderr) + + sys.exit(1) + + dependency_groups = {} + + for lockfile in lockfiles: + try: + with lockfile.open("r", encoding="utf-8") as fin: + dependency_groups[str(lockfile)] = _parse_lockfile(fin) + except (OSError, ValueError) as err: + print(f"Error reading lockfile at {lockfile}: {err}") + + sys.exit(2) + + merged_groups = _merge_dependency_groups(dependency_groups) + inconsts = _get_package_inconsistencies(merged_groups) + + if len(inconsts) > 0: + _print_package_inconsistencies(inconsts, errfile=sys.stderr) + + # We'll still give return code 0 here, since we just want to warn, not fail completely. + else: + print("No package inconsistencies found between environments.") + + sys.exit(0) + +def _get_package_inconsistencies(merged_groups: Dict[str, List[Tuple[str, str]]]) -> Dict[str, List[Tuple[str, str]]]: + """Given a dictionary mapping package names to lists of tuples, each tuple of which pairs + a specific lockfile with a version of that package, construct a new dictionary of the same + structure containing only those packages for which inconsistencies exist.""" + + result = {} + + for package, tuples in merged_groups.items(): + uniq_vers = _unique_versions(tuples) + + if len(uniq_vers) > 1: + result[package] = uniq_vers + + return result + +def _unique_versions(tuples: List[Tuple[str, str]]) -> List[Tuple[str, str]]: + """Given a list of tuples pairing lockfile paths with package versions, construct a new list + of tuples such that no version appears more than once in the list.""" + + res = [] + + for pair in tuples: + seen = False + + for uniq_pair in res: + if pair[1] == uniq_pair[1]: + seen = True + break + + if not seen: + res.append(pair) + + return res + +def _merge_dependency_groups(dep_groups: Dict[str, Dict[str, str]]) -> Dict[str, List[Tuple[str, str]]]: + """Combine two or more dictionaries, such that when the dictionaries have shared keys, the + resultant dictionary has a list of the original dictionaries' values under that key.""" + + result = defaultdict(list) + + for lockfile, dep_group in dep_groups.items(): + for key, val in dep_group.items(): + result[key].append((lockfile, val)) + + return result + +def _parse_lockfile(lockfile: TextIO) -> Dict[str, str]: + """Parse the requirements out of a lockfile, assuming the format generated by `piptools compile` + and return a dictionary of dependencies mapping package names to versions.""" + + requirements = {} + + for linenum, line in enumerate(lockfile.readlines()): + + line = line.strip() + + if line.startswith(("#", "-")): + continue + + line = line.split() + + if len(line) == 0: + continue + + line = next(iter(line)) + + try: + req = Requirement(line) + except Exception as err: + raise ValueError( + f"Line {linenum}: Error parsing requirement: {line}: {err}" + ) + + if len(req.specifier) != 1: + raise ValueError( + f"Line {linenum}: Expected exactly one pinned specifier, got: {line}" + ) + + spec = next(iter(req.specifier)) + + if spec.operator != "==": + raise ValueError( + f"Line {linenum}: Expected a '==' pin, got: {line}" + ) + + name = canonicalize_name(req.name) + requirements[name] = spec.version + + return requirements + +YELLOW = "\033[33m" +RESET = "\033[0m" + +def _print_package_inconsistencies(pkg_inconsts: Dict[str, List[Tuple[str, str]]], errfile) -> None: + """Print out any inconsistent package found.""" + + print(f"{YELLOW}Found the following inconsistent packages between environments:{RESET}\n", file=errfile) + + for pkg, tuples in pkg_inconsts.items(): + print(f"{YELLOW} Package: {pkg}\n{RESET}", file=errfile) + + for lockfile, version in tuples: + print(f"{YELLOW} - Lockfile {lockfile} requires version {version}.\n{RESET}", file=errfile) + +def _setup_parser() -> ArgumentParser: + """Configure the arguments for the parser.""" + + parser = ArgumentParser( + description="Checks for inconsistent dependencies between two or more " + "lockfiles.") + parser.add_argument("lockfiles", nargs='*', + help="The paths to the lockfiles to compare against one another. These may " + "be globs.") + + return parser + +if __name__ == "__main__": + main() \ No newline at end of file diff --git a/docs/requirements.txt b/docs/requirements.txt deleted file mode 100644 index c9f923be0..000000000 --- a/docs/requirements.txt +++ /dev/null @@ -1,4 +0,0 @@ -# Requirements for building documentation. - -sphinx > 4.0 -sphinx_rtd_theme >= 1.0.0 diff --git a/lib/certifi b/lib/certifi deleted file mode 120000 index c204f1594..000000000 --- a/lib/certifi +++ /dev/null @@ -1 +0,0 @@ -sub_repos/python-certifi/certifi/ \ No newline at end of file diff --git a/lib/chardet b/lib/chardet deleted file mode 120000 index 5c8b6af7b..000000000 --- a/lib/chardet +++ /dev/null @@ -1 +0,0 @@ -sub_repos/chardet/chardet/ \ No newline at end of file diff --git a/lib/flufl b/lib/flufl deleted file mode 120000 index b24c15a99..000000000 --- a/lib/flufl +++ /dev/null @@ -1 +0,0 @@ -sub_repos/flufl.lock/flufl \ No newline at end of file diff --git a/lib/idna b/lib/idna deleted file mode 120000 index 790c52e8f..000000000 --- a/lib/idna +++ /dev/null @@ -1 +0,0 @@ -sub_repos/idna/idna/ \ No newline at end of file diff --git a/lib/lark b/lib/lark deleted file mode 120000 index 767f04565..000000000 --- a/lib/lark +++ /dev/null @@ -1 +0,0 @@ -sub_repos/lark/lark \ No newline at end of file diff --git a/lib/packaging/__init__.py b/lib/packaging/__init__.py deleted file mode 100644 index 22809cfd5..000000000 --- a/lib/packaging/__init__.py +++ /dev/null @@ -1,15 +0,0 @@ -# This file is dual licensed under the terms of the Apache License, Version -# 2.0, and the BSD License. See the LICENSE file in the root of this repository -# for complete details. - -__title__ = "packaging" -__summary__ = "Core utilities for Python packages" -__uri__ = "https://github.com/pypa/packaging" - -__version__ = "23.2" - -__author__ = "Donald Stufft and individual contributors" -__email__ = "donald@stufft.io" - -__license__ = "BSD-2-Clause or Apache-2.0" -__copyright__ = "2014 %s" % __author__ diff --git a/lib/packaging/_elffile.py b/lib/packaging/_elffile.py deleted file mode 100644 index 6fb19b30b..000000000 --- a/lib/packaging/_elffile.py +++ /dev/null @@ -1,108 +0,0 @@ -""" -ELF file parser. - -This provides a class ``ELFFile`` that parses an ELF executable in a similar -interface to ``ZipFile``. Only the read interface is implemented. - -Based on: https://gist.github.com/lyssdod/f51579ae8d93c8657a5564aefc2ffbca -ELF header: https://refspecs.linuxfoundation.org/elf/gabi4+/ch4.eheader.html -""" - -import enum -import os -import struct -from typing import IO, Optional, Tuple - - -class ELFInvalid(ValueError): - pass - - -class EIClass(enum.IntEnum): - C32 = 1 - C64 = 2 - - -class EIData(enum.IntEnum): - Lsb = 1 - Msb = 2 - - -class EMachine(enum.IntEnum): - I386 = 3 - S390 = 22 - Arm = 40 - X8664 = 62 - AArc64 = 183 - - -class ELFFile: - """ - Representation of an ELF executable. - """ - - def __init__(self, f: IO[bytes]) -> None: - self._f = f - - try: - ident = self._read("16B") - except struct.error: - raise ELFInvalid("unable to parse identification") - magic = bytes(ident[:4]) - if magic != b"\x7fELF": - raise ELFInvalid(f"invalid magic: {magic!r}") - - self.capacity = ident[4] # Format for program header (bitness). - self.encoding = ident[5] # Data structure encoding (endianness). - - try: - # e_fmt: Format for program header. - # p_fmt: Format for section header. - # p_idx: Indexes to find p_type, p_offset, and p_filesz. - e_fmt, self._p_fmt, self._p_idx = { - (1, 1): ("HHIIIIIHHH", ">IIIIIIII", (0, 1, 4)), # 32-bit MSB. - (2, 1): ("HHIQQQIHHH", ">IIQQQQQQ", (0, 2, 5)), # 64-bit MSB. - }[(self.capacity, self.encoding)] - except KeyError: - raise ELFInvalid( - f"unrecognized capacity ({self.capacity}) or " - f"encoding ({self.encoding})" - ) - - try: - ( - _, - self.machine, # Architecture type. - _, - _, - self._e_phoff, # Offset of program header. - _, - self.flags, # Processor-specific flags. - _, - self._e_phentsize, # Size of section. - self._e_phnum, # Number of sections. - ) = self._read(e_fmt) - except struct.error as e: - raise ELFInvalid("unable to parse machine and section information") from e - - def _read(self, fmt: str) -> Tuple[int, ...]: - return struct.unpack(fmt, self._f.read(struct.calcsize(fmt))) - - @property - def interpreter(self) -> Optional[str]: - """ - The path recorded in the ``PT_INTERP`` section header. - """ - for index in range(self._e_phnum): - self._f.seek(self._e_phoff + self._e_phentsize * index) - try: - data = self._read(self._p_fmt) - except struct.error: - continue - if data[self._p_idx[0]] != 3: # Not PT_INTERP. - continue - self._f.seek(data[self._p_idx[1]]) - return os.fsdecode(self._f.read(data[self._p_idx[2]])).strip("\0") - return None diff --git a/lib/packaging/_manylinux.py b/lib/packaging/_manylinux.py deleted file mode 100644 index 3705d50db..000000000 --- a/lib/packaging/_manylinux.py +++ /dev/null @@ -1,252 +0,0 @@ -import collections -import contextlib -import functools -import os -import re -import sys -import warnings -from typing import Dict, Generator, Iterator, NamedTuple, Optional, Sequence, Tuple - -from ._elffile import EIClass, EIData, ELFFile, EMachine - -EF_ARM_ABIMASK = 0xFF000000 -EF_ARM_ABI_VER5 = 0x05000000 -EF_ARM_ABI_FLOAT_HARD = 0x00000400 - - -# `os.PathLike` not a generic type until Python 3.9, so sticking with `str` -# as the type for `path` until then. -@contextlib.contextmanager -def _parse_elf(path: str) -> Generator[Optional[ELFFile], None, None]: - try: - with open(path, "rb") as f: - yield ELFFile(f) - except (OSError, TypeError, ValueError): - yield None - - -def _is_linux_armhf(executable: str) -> bool: - # hard-float ABI can be detected from the ELF header of the running - # process - # https://static.docs.arm.com/ihi0044/g/aaelf32.pdf - with _parse_elf(executable) as f: - return ( - f is not None - and f.capacity == EIClass.C32 - and f.encoding == EIData.Lsb - and f.machine == EMachine.Arm - and f.flags & EF_ARM_ABIMASK == EF_ARM_ABI_VER5 - and f.flags & EF_ARM_ABI_FLOAT_HARD == EF_ARM_ABI_FLOAT_HARD - ) - - -def _is_linux_i686(executable: str) -> bool: - with _parse_elf(executable) as f: - return ( - f is not None - and f.capacity == EIClass.C32 - and f.encoding == EIData.Lsb - and f.machine == EMachine.I386 - ) - - -def _have_compatible_abi(executable: str, archs: Sequence[str]) -> bool: - if "armv7l" in archs: - return _is_linux_armhf(executable) - if "i686" in archs: - return _is_linux_i686(executable) - allowed_archs = {"x86_64", "aarch64", "ppc64", "ppc64le", "s390x", "loongarch64"} - return any(arch in allowed_archs for arch in archs) - - -# If glibc ever changes its major version, we need to know what the last -# minor version was, so we can build the complete list of all versions. -# For now, guess what the highest minor version might be, assume it will -# be 50 for testing. Once this actually happens, update the dictionary -# with the actual value. -_LAST_GLIBC_MINOR: Dict[int, int] = collections.defaultdict(lambda: 50) - - -class _GLibCVersion(NamedTuple): - major: int - minor: int - - -def _glibc_version_string_confstr() -> Optional[str]: - """ - Primary implementation of glibc_version_string using os.confstr. - """ - # os.confstr is quite a bit faster than ctypes.DLL. It's also less likely - # to be broken or missing. This strategy is used in the standard library - # platform module. - # https://github.com/python/cpython/blob/fcf1d003bf4f0100c/Lib/platform.py#L175-L183 - try: - # Should be a string like "glibc 2.17". - version_string: str = getattr(os, "confstr")("CS_GNU_LIBC_VERSION") - assert version_string is not None - _, version = version_string.rsplit() - except (AssertionError, AttributeError, OSError, ValueError): - # os.confstr() or CS_GNU_LIBC_VERSION not available (or a bad value)... - return None - return version - - -def _glibc_version_string_ctypes() -> Optional[str]: - """ - Fallback implementation of glibc_version_string using ctypes. - """ - try: - import ctypes - except ImportError: - return None - - # ctypes.CDLL(None) internally calls dlopen(NULL), and as the dlopen - # manpage says, "If filename is NULL, then the returned handle is for the - # main program". This way we can let the linker do the work to figure out - # which libc our process is actually using. - # - # We must also handle the special case where the executable is not a - # dynamically linked executable. This can occur when using musl libc, - # for example. In this situation, dlopen() will error, leading to an - # OSError. Interestingly, at least in the case of musl, there is no - # errno set on the OSError. The single string argument used to construct - # OSError comes from libc itself and is therefore not portable to - # hard code here. In any case, failure to call dlopen() means we - # can proceed, so we bail on our attempt. - try: - process_namespace = ctypes.CDLL(None) - except OSError: - return None - - try: - gnu_get_libc_version = process_namespace.gnu_get_libc_version - except AttributeError: - # Symbol doesn't exist -> therefore, we are not linked to - # glibc. - return None - - # Call gnu_get_libc_version, which returns a string like "2.5" - gnu_get_libc_version.restype = ctypes.c_char_p - version_str: str = gnu_get_libc_version() - # py2 / py3 compatibility: - if not isinstance(version_str, str): - version_str = version_str.decode("ascii") - - return version_str - - -def _glibc_version_string() -> Optional[str]: - """Returns glibc version string, or None if not using glibc.""" - return _glibc_version_string_confstr() or _glibc_version_string_ctypes() - - -def _parse_glibc_version(version_str: str) -> Tuple[int, int]: - """Parse glibc version. - - We use a regexp instead of str.split because we want to discard any - random junk that might come after the minor version -- this might happen - in patched/forked versions of glibc (e.g. Linaro's version of glibc - uses version strings like "2.20-2014.11"). See gh-3588. - """ - m = re.match(r"(?P[0-9]+)\.(?P[0-9]+)", version_str) - if not m: - warnings.warn( - f"Expected glibc version with 2 components major.minor," - f" got: {version_str}", - RuntimeWarning, - ) - return -1, -1 - return int(m.group("major")), int(m.group("minor")) - - -@functools.lru_cache() -def _get_glibc_version() -> Tuple[int, int]: - version_str = _glibc_version_string() - if version_str is None: - return (-1, -1) - return _parse_glibc_version(version_str) - - -# From PEP 513, PEP 600 -def _is_compatible(arch: str, version: _GLibCVersion) -> bool: - sys_glibc = _get_glibc_version() - if sys_glibc < version: - return False - # Check for presence of _manylinux module. - try: - import _manylinux # noqa - except ImportError: - return True - if hasattr(_manylinux, "manylinux_compatible"): - result = _manylinux.manylinux_compatible(version[0], version[1], arch) - if result is not None: - return bool(result) - return True - if version == _GLibCVersion(2, 5): - if hasattr(_manylinux, "manylinux1_compatible"): - return bool(_manylinux.manylinux1_compatible) - if version == _GLibCVersion(2, 12): - if hasattr(_manylinux, "manylinux2010_compatible"): - return bool(_manylinux.manylinux2010_compatible) - if version == _GLibCVersion(2, 17): - if hasattr(_manylinux, "manylinux2014_compatible"): - return bool(_manylinux.manylinux2014_compatible) - return True - - -_LEGACY_MANYLINUX_MAP = { - # CentOS 7 w/ glibc 2.17 (PEP 599) - (2, 17): "manylinux2014", - # CentOS 6 w/ glibc 2.12 (PEP 571) - (2, 12): "manylinux2010", - # CentOS 5 w/ glibc 2.5 (PEP 513) - (2, 5): "manylinux1", -} - - -def platform_tags(archs: Sequence[str]) -> Iterator[str]: - """Generate manylinux tags compatible to the current platform. - - :param archs: Sequence of compatible architectures. - The first one shall be the closest to the actual architecture and be the part of - platform tag after the ``linux_`` prefix, e.g. ``x86_64``. - The ``linux_`` prefix is assumed as a prerequisite for the current platform to - be manylinux-compatible. - - :returns: An iterator of compatible manylinux tags. - """ - if not _have_compatible_abi(sys.executable, archs): - return - # Oldest glibc to be supported regardless of architecture is (2, 17). - too_old_glibc2 = _GLibCVersion(2, 16) - if set(archs) & {"x86_64", "i686"}: - # On x86/i686 also oldest glibc to be supported is (2, 5). - too_old_glibc2 = _GLibCVersion(2, 4) - current_glibc = _GLibCVersion(*_get_glibc_version()) - glibc_max_list = [current_glibc] - # We can assume compatibility across glibc major versions. - # https://sourceware.org/bugzilla/show_bug.cgi?id=24636 - # - # Build a list of maximum glibc versions so that we can - # output the canonical list of all glibc from current_glibc - # down to too_old_glibc2, including all intermediary versions. - for glibc_major in range(current_glibc.major - 1, 1, -1): - glibc_minor = _LAST_GLIBC_MINOR[glibc_major] - glibc_max_list.append(_GLibCVersion(glibc_major, glibc_minor)) - for arch in archs: - for glibc_max in glibc_max_list: - if glibc_max.major == too_old_glibc2.major: - min_minor = too_old_glibc2.minor - else: - # For other glibc major versions oldest supported is (x, 0). - min_minor = -1 - for glibc_minor in range(glibc_max.minor, min_minor, -1): - glibc_version = _GLibCVersion(glibc_max.major, glibc_minor) - tag = "manylinux_{}_{}".format(*glibc_version) - if _is_compatible(arch, glibc_version): - yield f"{tag}_{arch}" - # Handle the legacy manylinux1, manylinux2010, manylinux2014 tags. - if glibc_version in _LEGACY_MANYLINUX_MAP: - legacy_tag = _LEGACY_MANYLINUX_MAP[glibc_version] - if _is_compatible(arch, glibc_version): - yield f"{legacy_tag}_{arch}" diff --git a/lib/packaging/_musllinux.py b/lib/packaging/_musllinux.py deleted file mode 100644 index 86419df9d..000000000 --- a/lib/packaging/_musllinux.py +++ /dev/null @@ -1,83 +0,0 @@ -"""PEP 656 support. - -This module implements logic to detect if the currently running Python is -linked against musl, and what musl version is used. -""" - -import functools -import re -import subprocess -import sys -from typing import Iterator, NamedTuple, Optional, Sequence - -from ._elffile import ELFFile - - -class _MuslVersion(NamedTuple): - major: int - minor: int - - -def _parse_musl_version(output: str) -> Optional[_MuslVersion]: - lines = [n for n in (n.strip() for n in output.splitlines()) if n] - if len(lines) < 2 or lines[0][:4] != "musl": - return None - m = re.match(r"Version (\d+)\.(\d+)", lines[1]) - if not m: - return None - return _MuslVersion(major=int(m.group(1)), minor=int(m.group(2))) - - -@functools.lru_cache() -def _get_musl_version(executable: str) -> Optional[_MuslVersion]: - """Detect currently-running musl runtime version. - - This is done by checking the specified executable's dynamic linking - information, and invoking the loader to parse its output for a version - string. If the loader is musl, the output would be something like:: - - musl libc (x86_64) - Version 1.2.2 - Dynamic Program Loader - """ - try: - with open(executable, "rb") as f: - ld = ELFFile(f).interpreter - except (OSError, TypeError, ValueError): - return None - if ld is None or "musl" not in ld: - return None - proc = subprocess.run([ld], stderr=subprocess.PIPE, text=True) - return _parse_musl_version(proc.stderr) - - -def platform_tags(archs: Sequence[str]) -> Iterator[str]: - """Generate musllinux tags compatible to the current platform. - - :param archs: Sequence of compatible architectures. - The first one shall be the closest to the actual architecture and be the part of - platform tag after the ``linux_`` prefix, e.g. ``x86_64``. - The ``linux_`` prefix is assumed as a prerequisite for the current platform to - be musllinux-compatible. - - :returns: An iterator of compatible musllinux tags. - """ - sys_musl = _get_musl_version(sys.executable) - if sys_musl is None: # Python not dynamically linked against musl. - return - for arch in archs: - for minor in range(sys_musl.minor, -1, -1): - yield f"musllinux_{sys_musl.major}_{minor}_{arch}" - - -if __name__ == "__main__": # pragma: no cover - import sysconfig - - plat = sysconfig.get_platform() - assert plat.startswith("linux-"), "not linux" - - print("plat:", plat) - print("musl:", _get_musl_version(sys.executable)) - print("tags:", end=" ") - for t in platform_tags(re.sub(r"[.-]", "_", plat.split("-", 1)[-1])): - print(t, end="\n ") diff --git a/lib/packaging/_parser.py b/lib/packaging/_parser.py deleted file mode 100644 index 4576981c2..000000000 --- a/lib/packaging/_parser.py +++ /dev/null @@ -1,359 +0,0 @@ -"""Handwritten parser of dependency specifiers. - -The docstring for each __parse_* function contains ENBF-inspired grammar representing -the implementation. -""" - -import ast -from typing import Any, List, NamedTuple, Optional, Tuple, Union - -from ._tokenizer import DEFAULT_RULES, Tokenizer - - -class Node: - def __init__(self, value: str) -> None: - self.value = value - - def __str__(self) -> str: - return self.value - - def __repr__(self) -> str: - return f"<{self.__class__.__name__}('{self}')>" - - def serialize(self) -> str: - raise NotImplementedError - - -class Variable(Node): - def serialize(self) -> str: - return str(self) - - -class Value(Node): - def serialize(self) -> str: - return f'"{self}"' - - -class Op(Node): - def serialize(self) -> str: - return str(self) - - -MarkerVar = Union[Variable, Value] -MarkerItem = Tuple[MarkerVar, Op, MarkerVar] -# MarkerAtom = Union[MarkerItem, List["MarkerAtom"]] -# MarkerList = List[Union["MarkerList", MarkerAtom, str]] -# mypy does not support recursive type definition -# https://github.com/python/mypy/issues/731 -MarkerAtom = Any -MarkerList = List[Any] - - -class ParsedRequirement(NamedTuple): - name: str - url: str - extras: List[str] - specifier: str - marker: Optional[MarkerList] - - -# -------------------------------------------------------------------------------------- -# Recursive descent parser for dependency specifier -# -------------------------------------------------------------------------------------- -def parse_requirement(source: str) -> ParsedRequirement: - return _parse_requirement(Tokenizer(source, rules=DEFAULT_RULES)) - - -def _parse_requirement(tokenizer: Tokenizer) -> ParsedRequirement: - """ - requirement = WS? IDENTIFIER WS? extras WS? requirement_details - """ - tokenizer.consume("WS") - - name_token = tokenizer.expect( - "IDENTIFIER", expected="package name at the start of dependency specifier" - ) - name = name_token.text - tokenizer.consume("WS") - - extras = _parse_extras(tokenizer) - tokenizer.consume("WS") - - url, specifier, marker = _parse_requirement_details(tokenizer) - tokenizer.expect("END", expected="end of dependency specifier") - - return ParsedRequirement(name, url, extras, specifier, marker) - - -def _parse_requirement_details( - tokenizer: Tokenizer, -) -> Tuple[str, str, Optional[MarkerList]]: - """ - requirement_details = AT URL (WS requirement_marker?)? - | specifier WS? (requirement_marker)? - """ - - specifier = "" - url = "" - marker = None - - if tokenizer.check("AT"): - tokenizer.read() - tokenizer.consume("WS") - - url_start = tokenizer.position - url = tokenizer.expect("URL", expected="URL after @").text - if tokenizer.check("END", peek=True): - return (url, specifier, marker) - - tokenizer.expect("WS", expected="whitespace after URL") - - # The input might end after whitespace. - if tokenizer.check("END", peek=True): - return (url, specifier, marker) - - marker = _parse_requirement_marker( - tokenizer, span_start=url_start, after="URL and whitespace" - ) - else: - specifier_start = tokenizer.position - specifier = _parse_specifier(tokenizer) - tokenizer.consume("WS") - - if tokenizer.check("END", peek=True): - return (url, specifier, marker) - - marker = _parse_requirement_marker( - tokenizer, - span_start=specifier_start, - after=( - "version specifier" - if specifier - else "name and no valid version specifier" - ), - ) - - return (url, specifier, marker) - - -def _parse_requirement_marker( - tokenizer: Tokenizer, *, span_start: int, after: str -) -> MarkerList: - """ - requirement_marker = SEMICOLON marker WS? - """ - - if not tokenizer.check("SEMICOLON"): - tokenizer.raise_syntax_error( - f"Expected end or semicolon (after {after})", - span_start=span_start, - ) - tokenizer.read() - - marker = _parse_marker(tokenizer) - tokenizer.consume("WS") - - return marker - - -def _parse_extras(tokenizer: Tokenizer) -> List[str]: - """ - extras = (LEFT_BRACKET wsp* extras_list? wsp* RIGHT_BRACKET)? - """ - if not tokenizer.check("LEFT_BRACKET", peek=True): - return [] - - with tokenizer.enclosing_tokens( - "LEFT_BRACKET", - "RIGHT_BRACKET", - around="extras", - ): - tokenizer.consume("WS") - extras = _parse_extras_list(tokenizer) - tokenizer.consume("WS") - - return extras - - -def _parse_extras_list(tokenizer: Tokenizer) -> List[str]: - """ - extras_list = identifier (wsp* ',' wsp* identifier)* - """ - extras: List[str] = [] - - if not tokenizer.check("IDENTIFIER"): - return extras - - extras.append(tokenizer.read().text) - - while True: - tokenizer.consume("WS") - if tokenizer.check("IDENTIFIER", peek=True): - tokenizer.raise_syntax_error("Expected comma between extra names") - elif not tokenizer.check("COMMA"): - break - - tokenizer.read() - tokenizer.consume("WS") - - extra_token = tokenizer.expect("IDENTIFIER", expected="extra name after comma") - extras.append(extra_token.text) - - return extras - - -def _parse_specifier(tokenizer: Tokenizer) -> str: - """ - specifier = LEFT_PARENTHESIS WS? version_many WS? RIGHT_PARENTHESIS - | WS? version_many WS? - """ - with tokenizer.enclosing_tokens( - "LEFT_PARENTHESIS", - "RIGHT_PARENTHESIS", - around="version specifier", - ): - tokenizer.consume("WS") - parsed_specifiers = _parse_version_many(tokenizer) - tokenizer.consume("WS") - - return parsed_specifiers - - -def _parse_version_many(tokenizer: Tokenizer) -> str: - """ - version_many = (SPECIFIER (WS? COMMA WS? SPECIFIER)*)? - """ - parsed_specifiers = "" - while tokenizer.check("SPECIFIER"): - span_start = tokenizer.position - parsed_specifiers += tokenizer.read().text - if tokenizer.check("VERSION_PREFIX_TRAIL", peek=True): - tokenizer.raise_syntax_error( - ".* suffix can only be used with `==` or `!=` operators", - span_start=span_start, - span_end=tokenizer.position + 1, - ) - if tokenizer.check("VERSION_LOCAL_LABEL_TRAIL", peek=True): - tokenizer.raise_syntax_error( - "Local version label can only be used with `==` or `!=` operators", - span_start=span_start, - span_end=tokenizer.position, - ) - tokenizer.consume("WS") - if not tokenizer.check("COMMA"): - break - parsed_specifiers += tokenizer.read().text - tokenizer.consume("WS") - - return parsed_specifiers - - -# -------------------------------------------------------------------------------------- -# Recursive descent parser for marker expression -# -------------------------------------------------------------------------------------- -def parse_marker(source: str) -> MarkerList: - return _parse_full_marker(Tokenizer(source, rules=DEFAULT_RULES)) - - -def _parse_full_marker(tokenizer: Tokenizer) -> MarkerList: - retval = _parse_marker(tokenizer) - tokenizer.expect("END", expected="end of marker expression") - return retval - - -def _parse_marker(tokenizer: Tokenizer) -> MarkerList: - """ - marker = marker_atom (BOOLOP marker_atom)+ - """ - expression = [_parse_marker_atom(tokenizer)] - while tokenizer.check("BOOLOP"): - token = tokenizer.read() - expr_right = _parse_marker_atom(tokenizer) - expression.extend((token.text, expr_right)) - return expression - - -def _parse_marker_atom(tokenizer: Tokenizer) -> MarkerAtom: - """ - marker_atom = WS? LEFT_PARENTHESIS WS? marker WS? RIGHT_PARENTHESIS WS? - | WS? marker_item WS? - """ - - tokenizer.consume("WS") - if tokenizer.check("LEFT_PARENTHESIS", peek=True): - with tokenizer.enclosing_tokens( - "LEFT_PARENTHESIS", - "RIGHT_PARENTHESIS", - around="marker expression", - ): - tokenizer.consume("WS") - marker: MarkerAtom = _parse_marker(tokenizer) - tokenizer.consume("WS") - else: - marker = _parse_marker_item(tokenizer) - tokenizer.consume("WS") - return marker - - -def _parse_marker_item(tokenizer: Tokenizer) -> MarkerItem: - """ - marker_item = WS? marker_var WS? marker_op WS? marker_var WS? - """ - tokenizer.consume("WS") - marker_var_left = _parse_marker_var(tokenizer) - tokenizer.consume("WS") - marker_op = _parse_marker_op(tokenizer) - tokenizer.consume("WS") - marker_var_right = _parse_marker_var(tokenizer) - tokenizer.consume("WS") - return (marker_var_left, marker_op, marker_var_right) - - -def _parse_marker_var(tokenizer: Tokenizer) -> MarkerVar: - """ - marker_var = VARIABLE | QUOTED_STRING - """ - if tokenizer.check("VARIABLE"): - return process_env_var(tokenizer.read().text.replace(".", "_")) - elif tokenizer.check("QUOTED_STRING"): - return process_python_str(tokenizer.read().text) - else: - tokenizer.raise_syntax_error( - message="Expected a marker variable or quoted string" - ) - - -def process_env_var(env_var: str) -> Variable: - if ( - env_var == "platform_python_implementation" - or env_var == "python_implementation" - ): - return Variable("platform_python_implementation") - else: - return Variable(env_var) - - -def process_python_str(python_str: str) -> Value: - value = ast.literal_eval(python_str) - return Value(str(value)) - - -def _parse_marker_op(tokenizer: Tokenizer) -> Op: - """ - marker_op = IN | NOT IN | OP - """ - if tokenizer.check("IN"): - tokenizer.read() - return Op("in") - elif tokenizer.check("NOT"): - tokenizer.read() - tokenizer.expect("WS", expected="whitespace after 'not'") - tokenizer.expect("IN", expected="'in' after 'not'") - return Op("not in") - elif tokenizer.check("OP"): - return Op(tokenizer.read().text) - else: - return tokenizer.raise_syntax_error( - "Expected marker operator, one of " - "<=, <, !=, ==, >=, >, ~=, ===, in, not in" - ) diff --git a/lib/packaging/_structures.py b/lib/packaging/_structures.py deleted file mode 100644 index 90a6465f9..000000000 --- a/lib/packaging/_structures.py +++ /dev/null @@ -1,61 +0,0 @@ -# This file is dual licensed under the terms of the Apache License, Version -# 2.0, and the BSD License. See the LICENSE file in the root of this repository -# for complete details. - - -class InfinityType: - def __repr__(self) -> str: - return "Infinity" - - def __hash__(self) -> int: - return hash(repr(self)) - - def __lt__(self, other: object) -> bool: - return False - - def __le__(self, other: object) -> bool: - return False - - def __eq__(self, other: object) -> bool: - return isinstance(other, self.__class__) - - def __gt__(self, other: object) -> bool: - return True - - def __ge__(self, other: object) -> bool: - return True - - def __neg__(self: object) -> "NegativeInfinityType": - return NegativeInfinity - - -Infinity = InfinityType() - - -class NegativeInfinityType: - def __repr__(self) -> str: - return "-Infinity" - - def __hash__(self) -> int: - return hash(repr(self)) - - def __lt__(self, other: object) -> bool: - return True - - def __le__(self, other: object) -> bool: - return True - - def __eq__(self, other: object) -> bool: - return isinstance(other, self.__class__) - - def __gt__(self, other: object) -> bool: - return False - - def __ge__(self, other: object) -> bool: - return False - - def __neg__(self: object) -> InfinityType: - return Infinity - - -NegativeInfinity = NegativeInfinityType() diff --git a/lib/packaging/_tokenizer.py b/lib/packaging/_tokenizer.py deleted file mode 100644 index dd0d648d4..000000000 --- a/lib/packaging/_tokenizer.py +++ /dev/null @@ -1,192 +0,0 @@ -import contextlib -import re -from dataclasses import dataclass -from typing import Dict, Iterator, NoReturn, Optional, Tuple, Union - -from .specifiers import Specifier - - -@dataclass -class Token: - name: str - text: str - position: int - - -class ParserSyntaxError(Exception): - """The provided source text could not be parsed correctly.""" - - def __init__( - self, - message: str, - *, - source: str, - span: Tuple[int, int], - ) -> None: - self.span = span - self.message = message - self.source = source - - super().__init__() - - def __str__(self) -> str: - marker = " " * self.span[0] + "~" * (self.span[1] - self.span[0]) + "^" - return "\n ".join([self.message, self.source, marker]) - - -DEFAULT_RULES: "Dict[str, Union[str, re.Pattern[str]]]" = { - "LEFT_PARENTHESIS": r"\(", - "RIGHT_PARENTHESIS": r"\)", - "LEFT_BRACKET": r"\[", - "RIGHT_BRACKET": r"\]", - "SEMICOLON": r";", - "COMMA": r",", - "QUOTED_STRING": re.compile( - r""" - ( - ('[^']*') - | - ("[^"]*") - ) - """, - re.VERBOSE, - ), - "OP": r"(===|==|~=|!=|<=|>=|<|>)", - "BOOLOP": r"\b(or|and)\b", - "IN": r"\bin\b", - "NOT": r"\bnot\b", - "VARIABLE": re.compile( - r""" - \b( - python_version - |python_full_version - |os[._]name - |sys[._]platform - |platform_(release|system) - |platform[._](version|machine|python_implementation) - |python_implementation - |implementation_(name|version) - |extra - )\b - """, - re.VERBOSE, - ), - "SPECIFIER": re.compile( - Specifier._operator_regex_str + Specifier._version_regex_str, - re.VERBOSE | re.IGNORECASE, - ), - "AT": r"\@", - "URL": r"[^ \t]+", - "IDENTIFIER": r"\b[a-zA-Z0-9][a-zA-Z0-9._-]*\b", - "VERSION_PREFIX_TRAIL": r"\.\*", - "VERSION_LOCAL_LABEL_TRAIL": r"\+[a-z0-9]+(?:[-_\.][a-z0-9]+)*", - "WS": r"[ \t]+", - "END": r"$", -} - - -class Tokenizer: - """Context-sensitive token parsing. - - Provides methods to examine the input stream to check whether the next token - matches. - """ - - def __init__( - self, - source: str, - *, - rules: "Dict[str, Union[str, re.Pattern[str]]]", - ) -> None: - self.source = source - self.rules: Dict[str, re.Pattern[str]] = { - name: re.compile(pattern) for name, pattern in rules.items() - } - self.next_token: Optional[Token] = None - self.position = 0 - - def consume(self, name: str) -> None: - """Move beyond provided token name, if at current position.""" - if self.check(name): - self.read() - - def check(self, name: str, *, peek: bool = False) -> bool: - """Check whether the next token has the provided name. - - By default, if the check succeeds, the token *must* be read before - another check. If `peek` is set to `True`, the token is not loaded and - would need to be checked again. - """ - assert ( - self.next_token is None - ), f"Cannot check for {name!r}, already have {self.next_token!r}" - assert name in self.rules, f"Unknown token name: {name!r}" - - expression = self.rules[name] - - match = expression.match(self.source, self.position) - if match is None: - return False - if not peek: - self.next_token = Token(name, match[0], self.position) - return True - - def expect(self, name: str, *, expected: str) -> Token: - """Expect a certain token name next, failing with a syntax error otherwise. - - The token is *not* read. - """ - if not self.check(name): - raise self.raise_syntax_error(f"Expected {expected}") - return self.read() - - def read(self) -> Token: - """Consume the next token and return it.""" - token = self.next_token - assert token is not None - - self.position += len(token.text) - self.next_token = None - - return token - - def raise_syntax_error( - self, - message: str, - *, - span_start: Optional[int] = None, - span_end: Optional[int] = None, - ) -> NoReturn: - """Raise ParserSyntaxError at the given position.""" - span = ( - self.position if span_start is None else span_start, - self.position if span_end is None else span_end, - ) - raise ParserSyntaxError( - message, - source=self.source, - span=span, - ) - - @contextlib.contextmanager - def enclosing_tokens( - self, open_token: str, close_token: str, *, around: str - ) -> Iterator[None]: - if self.check(open_token): - open_position = self.position - self.read() - else: - open_position = None - - yield - - if open_position is None: - return - - if not self.check(close_token): - self.raise_syntax_error( - f"Expected matching {close_token} for {open_token}, after {around}", - span_start=open_position, - ) - - self.read() diff --git a/lib/packaging/markers.py b/lib/packaging/markers.py deleted file mode 100644 index 8b98fca72..000000000 --- a/lib/packaging/markers.py +++ /dev/null @@ -1,252 +0,0 @@ -# This file is dual licensed under the terms of the Apache License, Version -# 2.0, and the BSD License. See the LICENSE file in the root of this repository -# for complete details. - -import operator -import os -import platform -import sys -from typing import Any, Callable, Dict, List, Optional, Tuple, Union - -from ._parser import ( - MarkerAtom, - MarkerList, - Op, - Value, - Variable, - parse_marker as _parse_marker, -) -from ._tokenizer import ParserSyntaxError -from .specifiers import InvalidSpecifier, Specifier -from .utils import canonicalize_name - -__all__ = [ - "InvalidMarker", - "UndefinedComparison", - "UndefinedEnvironmentName", - "Marker", - "default_environment", -] - -Operator = Callable[[str, str], bool] - - -class InvalidMarker(ValueError): - """ - An invalid marker was found, users should refer to PEP 508. - """ - - -class UndefinedComparison(ValueError): - """ - An invalid operation was attempted on a value that doesn't support it. - """ - - -class UndefinedEnvironmentName(ValueError): - """ - A name was attempted to be used that does not exist inside of the - environment. - """ - - -def _normalize_extra_values(results: Any) -> Any: - """ - Normalize extra values. - """ - if isinstance(results[0], tuple): - lhs, op, rhs = results[0] - if isinstance(lhs, Variable) and lhs.value == "extra": - normalized_extra = canonicalize_name(rhs.value) - rhs = Value(normalized_extra) - elif isinstance(rhs, Variable) and rhs.value == "extra": - normalized_extra = canonicalize_name(lhs.value) - lhs = Value(normalized_extra) - results[0] = lhs, op, rhs - return results - - -def _format_marker( - marker: Union[List[str], MarkerAtom, str], first: Optional[bool] = True -) -> str: - - assert isinstance(marker, (list, tuple, str)) - - # Sometimes we have a structure like [[...]] which is a single item list - # where the single item is itself it's own list. In that case we want skip - # the rest of this function so that we don't get extraneous () on the - # outside. - if ( - isinstance(marker, list) - and len(marker) == 1 - and isinstance(marker[0], (list, tuple)) - ): - return _format_marker(marker[0]) - - if isinstance(marker, list): - inner = (_format_marker(m, first=False) for m in marker) - if first: - return " ".join(inner) - else: - return "(" + " ".join(inner) + ")" - elif isinstance(marker, tuple): - return " ".join([m.serialize() for m in marker]) - else: - return marker - - -_operators: Dict[str, Operator] = { - "in": lambda lhs, rhs: lhs in rhs, - "not in": lambda lhs, rhs: lhs not in rhs, - "<": operator.lt, - "<=": operator.le, - "==": operator.eq, - "!=": operator.ne, - ">=": operator.ge, - ">": operator.gt, -} - - -def _eval_op(lhs: str, op: Op, rhs: str) -> bool: - try: - spec = Specifier("".join([op.serialize(), rhs])) - except InvalidSpecifier: - pass - else: - return spec.contains(lhs, prereleases=True) - - oper: Optional[Operator] = _operators.get(op.serialize()) - if oper is None: - raise UndefinedComparison(f"Undefined {op!r} on {lhs!r} and {rhs!r}.") - - return oper(lhs, rhs) - - -def _normalize(*values: str, key: str) -> Tuple[str, ...]: - # PEP 685 – Comparison of extra names for optional distribution dependencies - # https://peps.python.org/pep-0685/ - # > When comparing extra names, tools MUST normalize the names being - # > compared using the semantics outlined in PEP 503 for names - if key == "extra": - return tuple(canonicalize_name(v) for v in values) - - # other environment markers don't have such standards - return values - - -def _evaluate_markers(markers: MarkerList, environment: Dict[str, str]) -> bool: - groups: List[List[bool]] = [[]] - - for marker in markers: - assert isinstance(marker, (list, tuple, str)) - - if isinstance(marker, list): - groups[-1].append(_evaluate_markers(marker, environment)) - elif isinstance(marker, tuple): - lhs, op, rhs = marker - - if isinstance(lhs, Variable): - environment_key = lhs.value - lhs_value = environment[environment_key] - rhs_value = rhs.value - else: - lhs_value = lhs.value - environment_key = rhs.value - rhs_value = environment[environment_key] - - lhs_value, rhs_value = _normalize(lhs_value, rhs_value, key=environment_key) - groups[-1].append(_eval_op(lhs_value, op, rhs_value)) - else: - assert marker in ["and", "or"] - if marker == "or": - groups.append([]) - - return any(all(item) for item in groups) - - -def format_full_version(info: "sys._version_info") -> str: - version = "{0.major}.{0.minor}.{0.micro}".format(info) - kind = info.releaselevel - if kind != "final": - version += kind[0] + str(info.serial) - return version - - -def default_environment() -> Dict[str, str]: - iver = format_full_version(sys.implementation.version) - implementation_name = sys.implementation.name - return { - "implementation_name": implementation_name, - "implementation_version": iver, - "os_name": os.name, - "platform_machine": platform.machine(), - "platform_release": platform.release(), - "platform_system": platform.system(), - "platform_version": platform.version(), - "python_full_version": platform.python_version(), - "platform_python_implementation": platform.python_implementation(), - "python_version": ".".join(platform.python_version_tuple()[:2]), - "sys_platform": sys.platform, - } - - -class Marker: - def __init__(self, marker: str) -> None: - # Note: We create a Marker object without calling this constructor in - # packaging.requirements.Requirement. If any additional logic is - # added here, make sure to mirror/adapt Requirement. - try: - self._markers = _normalize_extra_values(_parse_marker(marker)) - # The attribute `_markers` can be described in terms of a recursive type: - # MarkerList = List[Union[Tuple[Node, ...], str, MarkerList]] - # - # For example, the following expression: - # python_version > "3.6" or (python_version == "3.6" and os_name == "unix") - # - # is parsed into: - # [ - # (, ')>, ), - # 'and', - # [ - # (, , ), - # 'or', - # (, , ) - # ] - # ] - except ParserSyntaxError as e: - raise InvalidMarker(str(e)) from e - - def __str__(self) -> str: - return _format_marker(self._markers) - - def __repr__(self) -> str: - return f"" - - def __hash__(self) -> int: - return hash((self.__class__.__name__, str(self))) - - def __eq__(self, other: Any) -> bool: - if not isinstance(other, Marker): - return NotImplemented - - return str(self) == str(other) - - def evaluate(self, environment: Optional[Dict[str, str]] = None) -> bool: - """Evaluate a marker. - - Return the boolean from evaluating the given marker against the - environment. environment is an optional argument to override all or - part of the determined environment. - - The environment is determined from the current Python process. - """ - current_environment = default_environment() - current_environment["extra"] = "" - if environment is not None: - current_environment.update(environment) - # The API used to allow setting extra to None. We need to handle this - # case for backwards compatibility. - if current_environment["extra"] is None: - current_environment["extra"] = "" - - return _evaluate_markers(self._markers, current_environment) diff --git a/lib/packaging/metadata.py b/lib/packaging/metadata.py deleted file mode 100644 index 7b0e6a9c3..000000000 --- a/lib/packaging/metadata.py +++ /dev/null @@ -1,822 +0,0 @@ -import email.feedparser -import email.header -import email.message -import email.parser -import email.policy -import sys -import typing -from typing import ( - Any, - Callable, - Dict, - Generic, - List, - Optional, - Tuple, - Type, - Union, - cast, -) - -from . import requirements, specifiers, utils, version as version_module - -T = typing.TypeVar("T") -if sys.version_info[:2] >= (3, 8): # pragma: no cover - from typing import Literal, TypedDict -else: # pragma: no cover - if typing.TYPE_CHECKING: - from typing_extensions import Literal, TypedDict - else: - try: - from typing_extensions import Literal, TypedDict - except ImportError: - - class Literal: - def __init_subclass__(*_args, **_kwargs): - pass - - class TypedDict: - def __init_subclass__(*_args, **_kwargs): - pass - - -try: - ExceptionGroup = __builtins__.ExceptionGroup # type: ignore[attr-defined] -except AttributeError: - - class ExceptionGroup(Exception): # type: ignore[no-redef] # noqa: N818 - """A minimal implementation of :external:exc:`ExceptionGroup` from Python 3.11. - - If :external:exc:`ExceptionGroup` is already defined by Python itself, - that version is used instead. - """ - - message: str - exceptions: List[Exception] - - def __init__(self, message: str, exceptions: List[Exception]) -> None: - self.message = message - self.exceptions = exceptions - - def __repr__(self) -> str: - return f"{self.__class__.__name__}({self.message!r}, {self.exceptions!r})" - - -class InvalidMetadata(ValueError): - """A metadata field contains invalid data.""" - - field: str - """The name of the field that contains invalid data.""" - - def __init__(self, field: str, message: str) -> None: - self.field = field - super().__init__(message) - - -# The RawMetadata class attempts to make as few assumptions about the underlying -# serialization formats as possible. The idea is that as long as a serialization -# formats offer some very basic primitives in *some* way then we can support -# serializing to and from that format. -class RawMetadata(TypedDict, total=False): - """A dictionary of raw core metadata. - - Each field in core metadata maps to a key of this dictionary (when data is - provided). The key is lower-case and underscores are used instead of dashes - compared to the equivalent core metadata field. Any core metadata field that - can be specified multiple times or can hold multiple values in a single - field have a key with a plural name. See :class:`Metadata` whose attributes - match the keys of this dictionary. - - Core metadata fields that can be specified multiple times are stored as a - list or dict depending on which is appropriate for the field. Any fields - which hold multiple values in a single field are stored as a list. - - """ - - # Metadata 1.0 - PEP 241 - metadata_version: str - name: str - version: str - platforms: List[str] - summary: str - description: str - keywords: List[str] - home_page: str - author: str - author_email: str - license: str - - # Metadata 1.1 - PEP 314 - supported_platforms: List[str] - download_url: str - classifiers: List[str] - requires: List[str] - provides: List[str] - obsoletes: List[str] - - # Metadata 1.2 - PEP 345 - maintainer: str - maintainer_email: str - requires_dist: List[str] - provides_dist: List[str] - obsoletes_dist: List[str] - requires_python: str - requires_external: List[str] - project_urls: Dict[str, str] - - # Metadata 2.0 - # PEP 426 attempted to completely revamp the metadata format - # but got stuck without ever being able to build consensus on - # it and ultimately ended up withdrawn. - # - # However, a number of tools had started emitting METADATA with - # `2.0` Metadata-Version, so for historical reasons, this version - # was skipped. - - # Metadata 2.1 - PEP 566 - description_content_type: str - provides_extra: List[str] - - # Metadata 2.2 - PEP 643 - dynamic: List[str] - - # Metadata 2.3 - PEP 685 - # No new fields were added in PEP 685, just some edge case were - # tightened up to provide better interoptability. - - -_STRING_FIELDS = { - "author", - "author_email", - "description", - "description_content_type", - "download_url", - "home_page", - "license", - "maintainer", - "maintainer_email", - "metadata_version", - "name", - "requires_python", - "summary", - "version", -} - -_LIST_FIELDS = { - "classifiers", - "dynamic", - "obsoletes", - "obsoletes_dist", - "platforms", - "provides", - "provides_dist", - "provides_extra", - "requires", - "requires_dist", - "requires_external", - "supported_platforms", -} - -_DICT_FIELDS = { - "project_urls", -} - - -def _parse_keywords(data: str) -> List[str]: - """Split a string of comma-separate keyboards into a list of keywords.""" - return [k.strip() for k in data.split(",")] - - -def _parse_project_urls(data: List[str]) -> Dict[str, str]: - """Parse a list of label/URL string pairings separated by a comma.""" - urls = {} - for pair in data: - # Our logic is slightly tricky here as we want to try and do - # *something* reasonable with malformed data. - # - # The main thing that we have to worry about, is data that does - # not have a ',' at all to split the label from the Value. There - # isn't a singular right answer here, and we will fail validation - # later on (if the caller is validating) so it doesn't *really* - # matter, but since the missing value has to be an empty str - # and our return value is dict[str, str], if we let the key - # be the missing value, then they'd have multiple '' values that - # overwrite each other in a accumulating dict. - # - # The other potentional issue is that it's possible to have the - # same label multiple times in the metadata, with no solid "right" - # answer with what to do in that case. As such, we'll do the only - # thing we can, which is treat the field as unparseable and add it - # to our list of unparsed fields. - parts = [p.strip() for p in pair.split(",", 1)] - parts.extend([""] * (max(0, 2 - len(parts)))) # Ensure 2 items - - # TODO: The spec doesn't say anything about if the keys should be - # considered case sensitive or not... logically they should - # be case-preserving and case-insensitive, but doing that - # would open up more cases where we might have duplicate - # entries. - label, url = parts - if label in urls: - # The label already exists in our set of urls, so this field - # is unparseable, and we can just add the whole thing to our - # unparseable data and stop processing it. - raise KeyError("duplicate labels in project urls") - urls[label] = url - - return urls - - -def _get_payload(msg: email.message.Message, source: Union[bytes, str]) -> str: - """Get the body of the message.""" - # If our source is a str, then our caller has managed encodings for us, - # and we don't need to deal with it. - if isinstance(source, str): - payload: str = msg.get_payload() - return payload - # If our source is a bytes, then we're managing the encoding and we need - # to deal with it. - else: - bpayload: bytes = msg.get_payload(decode=True) - try: - return bpayload.decode("utf8", "strict") - except UnicodeDecodeError: - raise ValueError("payload in an invalid encoding") - - -# The various parse_FORMAT functions here are intended to be as lenient as -# possible in their parsing, while still returning a correctly typed -# RawMetadata. -# -# To aid in this, we also generally want to do as little touching of the -# data as possible, except where there are possibly some historic holdovers -# that make valid data awkward to work with. -# -# While this is a lower level, intermediate format than our ``Metadata`` -# class, some light touch ups can make a massive difference in usability. - -# Map METADATA fields to RawMetadata. -_EMAIL_TO_RAW_MAPPING = { - "author": "author", - "author-email": "author_email", - "classifier": "classifiers", - "description": "description", - "description-content-type": "description_content_type", - "download-url": "download_url", - "dynamic": "dynamic", - "home-page": "home_page", - "keywords": "keywords", - "license": "license", - "maintainer": "maintainer", - "maintainer-email": "maintainer_email", - "metadata-version": "metadata_version", - "name": "name", - "obsoletes": "obsoletes", - "obsoletes-dist": "obsoletes_dist", - "platform": "platforms", - "project-url": "project_urls", - "provides": "provides", - "provides-dist": "provides_dist", - "provides-extra": "provides_extra", - "requires": "requires", - "requires-dist": "requires_dist", - "requires-external": "requires_external", - "requires-python": "requires_python", - "summary": "summary", - "supported-platform": "supported_platforms", - "version": "version", -} -_RAW_TO_EMAIL_MAPPING = {raw: email for email, raw in _EMAIL_TO_RAW_MAPPING.items()} - - -def parse_email(data: Union[bytes, str]) -> Tuple[RawMetadata, Dict[str, List[str]]]: - """Parse a distribution's metadata stored as email headers (e.g. from ``METADATA``). - - This function returns a two-item tuple of dicts. The first dict is of - recognized fields from the core metadata specification. Fields that can be - parsed and translated into Python's built-in types are converted - appropriately. All other fields are left as-is. Fields that are allowed to - appear multiple times are stored as lists. - - The second dict contains all other fields from the metadata. This includes - any unrecognized fields. It also includes any fields which are expected to - be parsed into a built-in type but were not formatted appropriately. Finally, - any fields that are expected to appear only once but are repeated are - included in this dict. - - """ - raw: Dict[str, Union[str, List[str], Dict[str, str]]] = {} - unparsed: Dict[str, List[str]] = {} - - if isinstance(data, str): - parsed = email.parser.Parser(policy=email.policy.compat32).parsestr(data) - else: - parsed = email.parser.BytesParser(policy=email.policy.compat32).parsebytes(data) - - # We have to wrap parsed.keys() in a set, because in the case of multiple - # values for a key (a list), the key will appear multiple times in the - # list of keys, but we're avoiding that by using get_all(). - for name in frozenset(parsed.keys()): - # Header names in RFC are case insensitive, so we'll normalize to all - # lower case to make comparisons easier. - name = name.lower() - - # We use get_all() here, even for fields that aren't multiple use, - # because otherwise someone could have e.g. two Name fields, and we - # would just silently ignore it rather than doing something about it. - headers = parsed.get_all(name) or [] - - # The way the email module works when parsing bytes is that it - # unconditionally decodes the bytes as ascii using the surrogateescape - # handler. When you pull that data back out (such as with get_all() ), - # it looks to see if the str has any surrogate escapes, and if it does - # it wraps it in a Header object instead of returning the string. - # - # As such, we'll look for those Header objects, and fix up the encoding. - value = [] - # Flag if we have run into any issues processing the headers, thus - # signalling that the data belongs in 'unparsed'. - valid_encoding = True - for h in headers: - # It's unclear if this can return more types than just a Header or - # a str, so we'll just assert here to make sure. - assert isinstance(h, (email.header.Header, str)) - - # If it's a header object, we need to do our little dance to get - # the real data out of it. In cases where there is invalid data - # we're going to end up with mojibake, but there's no obvious, good - # way around that without reimplementing parts of the Header object - # ourselves. - # - # That should be fine since, if mojibacked happens, this key is - # going into the unparsed dict anyways. - if isinstance(h, email.header.Header): - # The Header object stores it's data as chunks, and each chunk - # can be independently encoded, so we'll need to check each - # of them. - chunks: List[Tuple[bytes, Optional[str]]] = [] - for bin, encoding in email.header.decode_header(h): - try: - bin.decode("utf8", "strict") - except UnicodeDecodeError: - # Enable mojibake. - encoding = "latin1" - valid_encoding = False - else: - encoding = "utf8" - chunks.append((bin, encoding)) - - # Turn our chunks back into a Header object, then let that - # Header object do the right thing to turn them into a - # string for us. - value.append(str(email.header.make_header(chunks))) - # This is already a string, so just add it. - else: - value.append(h) - - # We've processed all of our values to get them into a list of str, - # but we may have mojibake data, in which case this is an unparsed - # field. - if not valid_encoding: - unparsed[name] = value - continue - - raw_name = _EMAIL_TO_RAW_MAPPING.get(name) - if raw_name is None: - # This is a bit of a weird situation, we've encountered a key that - # we don't know what it means, so we don't know whether it's meant - # to be a list or not. - # - # Since we can't really tell one way or another, we'll just leave it - # as a list, even though it may be a single item list, because that's - # what makes the most sense for email headers. - unparsed[name] = value - continue - - # If this is one of our string fields, then we'll check to see if our - # value is a list of a single item. If it is then we'll assume that - # it was emitted as a single string, and unwrap the str from inside - # the list. - # - # If it's any other kind of data, then we haven't the faintest clue - # what we should parse it as, and we have to just add it to our list - # of unparsed stuff. - if raw_name in _STRING_FIELDS and len(value) == 1: - raw[raw_name] = value[0] - # If this is one of our list of string fields, then we can just assign - # the value, since email *only* has strings, and our get_all() call - # above ensures that this is a list. - elif raw_name in _LIST_FIELDS: - raw[raw_name] = value - # Special Case: Keywords - # The keywords field is implemented in the metadata spec as a str, - # but it conceptually is a list of strings, and is serialized using - # ", ".join(keywords), so we'll do some light data massaging to turn - # this into what it logically is. - elif raw_name == "keywords" and len(value) == 1: - raw[raw_name] = _parse_keywords(value[0]) - # Special Case: Project-URL - # The project urls is implemented in the metadata spec as a list of - # specially-formatted strings that represent a key and a value, which - # is fundamentally a mapping, however the email format doesn't support - # mappings in a sane way, so it was crammed into a list of strings - # instead. - # - # We will do a little light data massaging to turn this into a map as - # it logically should be. - elif raw_name == "project_urls": - try: - raw[raw_name] = _parse_project_urls(value) - except KeyError: - unparsed[name] = value - # Nothing that we've done has managed to parse this, so it'll just - # throw it in our unparseable data and move on. - else: - unparsed[name] = value - - # We need to support getting the Description from the message payload in - # addition to getting it from the the headers. This does mean, though, there - # is the possibility of it being set both ways, in which case we put both - # in 'unparsed' since we don't know which is right. - try: - payload = _get_payload(parsed, data) - except ValueError: - unparsed.setdefault("description", []).append( - parsed.get_payload(decode=isinstance(data, bytes)) - ) - else: - if payload: - # Check to see if we've already got a description, if so then both - # it, and this body move to unparseable. - if "description" in raw: - description_header = cast(str, raw.pop("description")) - unparsed.setdefault("description", []).extend( - [description_header, payload] - ) - elif "description" in unparsed: - unparsed["description"].append(payload) - else: - raw["description"] = payload - - # We need to cast our `raw` to a metadata, because a TypedDict only support - # literal key names, but we're computing our key names on purpose, but the - # way this function is implemented, our `TypedDict` can only have valid key - # names. - return cast(RawMetadata, raw), unparsed - - -_NOT_FOUND = object() - - -# Keep the two values in sync. -_VALID_METADATA_VERSIONS = ["1.0", "1.1", "1.2", "2.1", "2.2", "2.3"] -_MetadataVersion = Literal["1.0", "1.1", "1.2", "2.1", "2.2", "2.3"] - -_REQUIRED_ATTRS = frozenset(["metadata_version", "name", "version"]) - - -class _Validator(Generic[T]): - """Validate a metadata field. - - All _process_*() methods correspond to a core metadata field. The method is - called with the field's raw value. If the raw value is valid it is returned - in its "enriched" form (e.g. ``version.Version`` for the ``Version`` field). - If the raw value is invalid, :exc:`InvalidMetadata` is raised (with a cause - as appropriate). - """ - - name: str - raw_name: str - added: _MetadataVersion - - def __init__( - self, - *, - added: _MetadataVersion = "1.0", - ) -> None: - self.added = added - - def __set_name__(self, _owner: "Metadata", name: str) -> None: - self.name = name - self.raw_name = _RAW_TO_EMAIL_MAPPING[name] - - def __get__(self, instance: "Metadata", _owner: Type["Metadata"]) -> T: - # With Python 3.8, the caching can be replaced with functools.cached_property(). - # No need to check the cache as attribute lookup will resolve into the - # instance's __dict__ before __get__ is called. - cache = instance.__dict__ - try: - value = instance._raw[self.name] # type: ignore[literal-required] - except KeyError: - if self.name in _STRING_FIELDS: - value = "" - elif self.name in _LIST_FIELDS: - value = [] - elif self.name in _DICT_FIELDS: - value = {} - else: # pragma: no cover - assert False - - try: - converter: Callable[[Any], T] = getattr(self, f"_process_{self.name}") - except AttributeError: - pass - else: - value = converter(value) - - cache[self.name] = value - try: - del instance._raw[self.name] # type: ignore[misc] - except KeyError: - pass - - return cast(T, value) - - def _invalid_metadata( - self, msg: str, cause: Optional[Exception] = None - ) -> InvalidMetadata: - exc = InvalidMetadata( - self.raw_name, msg.format_map({"field": repr(self.raw_name)}) - ) - exc.__cause__ = cause - return exc - - def _process_metadata_version(self, value: str) -> _MetadataVersion: - # Implicitly makes Metadata-Version required. - if value not in _VALID_METADATA_VERSIONS: - raise self._invalid_metadata(f"{value!r} is not a valid metadata version") - return cast(_MetadataVersion, value) - - def _process_name(self, value: str) -> str: - if not value: - raise self._invalid_metadata("{field} is a required field") - # Validate the name as a side-effect. - try: - utils.canonicalize_name(value, validate=True) - except utils.InvalidName as exc: - raise self._invalid_metadata( - f"{value!r} is invalid for {{field}}", cause=exc - ) - else: - return value - - def _process_version(self, value: str) -> version_module.Version: - if not value: - raise self._invalid_metadata("{field} is a required field") - try: - return version_module.parse(value) - except version_module.InvalidVersion as exc: - raise self._invalid_metadata( - f"{value!r} is invalid for {{field}}", cause=exc - ) - - def _process_summary(self, value: str) -> str: - """Check the field contains no newlines.""" - if "\n" in value: - raise self._invalid_metadata("{field} must be a single line") - return value - - def _process_description_content_type(self, value: str) -> str: - content_types = {"text/plain", "text/x-rst", "text/markdown"} - message = email.message.EmailMessage() - message["content-type"] = value - - content_type, parameters = ( - # Defaults to `text/plain` if parsing failed. - message.get_content_type().lower(), - message["content-type"].params, - ) - # Check if content-type is valid or defaulted to `text/plain` and thus was - # not parseable. - if content_type not in content_types or content_type not in value.lower(): - raise self._invalid_metadata( - f"{{field}} must be one of {list(content_types)}, not {value!r}" - ) - - charset = parameters.get("charset", "UTF-8") - if charset != "UTF-8": - raise self._invalid_metadata( - f"{{field}} can only specify the UTF-8 charset, not {list(charset)}" - ) - - markdown_variants = {"GFM", "CommonMark"} - variant = parameters.get("variant", "GFM") # Use an acceptable default. - if content_type == "text/markdown" and variant not in markdown_variants: - raise self._invalid_metadata( - f"valid Markdown variants for {{field}} are {list(markdown_variants)}, " - f"not {variant!r}", - ) - return value - - def _process_dynamic(self, value: List[str]) -> List[str]: - for dynamic_field in map(str.lower, value): - if dynamic_field in {"name", "version", "metadata-version"}: - raise self._invalid_metadata( - f"{value!r} is not allowed as a dynamic field" - ) - elif dynamic_field not in _EMAIL_TO_RAW_MAPPING: - raise self._invalid_metadata(f"{value!r} is not a valid dynamic field") - return list(map(str.lower, value)) - - def _process_provides_extra( - self, - value: List[str], - ) -> List[utils.NormalizedName]: - normalized_names = [] - try: - for name in value: - normalized_names.append(utils.canonicalize_name(name, validate=True)) - except utils.InvalidName as exc: - raise self._invalid_metadata( - f"{name!r} is invalid for {{field}}", cause=exc - ) - else: - return normalized_names - - def _process_requires_python(self, value: str) -> specifiers.SpecifierSet: - try: - return specifiers.SpecifierSet(value) - except specifiers.InvalidSpecifier as exc: - raise self._invalid_metadata( - f"{value!r} is invalid for {{field}}", cause=exc - ) - - def _process_requires_dist( - self, - value: List[str], - ) -> List[requirements.Requirement]: - reqs = [] - try: - for req in value: - reqs.append(requirements.Requirement(req)) - except requirements.InvalidRequirement as exc: - raise self._invalid_metadata(f"{req!r} is invalid for {{field}}", cause=exc) - else: - return reqs - - -class Metadata: - """Representation of distribution metadata. - - Compared to :class:`RawMetadata`, this class provides objects representing - metadata fields instead of only using built-in types. Any invalid metadata - will cause :exc:`InvalidMetadata` to be raised (with a - :py:attr:`~BaseException.__cause__` attribute as appropriate). - """ - - _raw: RawMetadata - - @classmethod - def from_raw(cls, data: RawMetadata, *, validate: bool = True) -> "Metadata": - """Create an instance from :class:`RawMetadata`. - - If *validate* is true, all metadata will be validated. All exceptions - related to validation will be gathered and raised as an :class:`ExceptionGroup`. - """ - ins = cls() - ins._raw = data.copy() # Mutations occur due to caching enriched values. - - if validate: - exceptions: List[InvalidMetadata] = [] - try: - metadata_version = ins.metadata_version - metadata_age = _VALID_METADATA_VERSIONS.index(metadata_version) - except InvalidMetadata as metadata_version_exc: - exceptions.append(metadata_version_exc) - metadata_version = None - - # Make sure to check for the fields that are present, the required - # fields (so their absence can be reported). - fields_to_check = frozenset(ins._raw) | _REQUIRED_ATTRS - # Remove fields that have already been checked. - fields_to_check -= {"metadata_version"} - - for key in fields_to_check: - try: - if metadata_version: - # Can't use getattr() as that triggers descriptor protocol which - # will fail due to no value for the instance argument. - try: - field_metadata_version = cls.__dict__[key].added - except KeyError: - exc = InvalidMetadata(key, f"unrecognized field: {key!r}") - exceptions.append(exc) - continue - field_age = _VALID_METADATA_VERSIONS.index( - field_metadata_version - ) - if field_age > metadata_age: - field = _RAW_TO_EMAIL_MAPPING[key] - exc = InvalidMetadata( - field, - "{field} introduced in metadata version " - "{field_metadata_version}, not {metadata_version}", - ) - exceptions.append(exc) - continue - getattr(ins, key) - except InvalidMetadata as exc: - exceptions.append(exc) - - if exceptions: - raise ExceptionGroup("invalid metadata", exceptions) - - return ins - - @classmethod - def from_email( - cls, data: Union[bytes, str], *, validate: bool = True - ) -> "Metadata": - """Parse metadata from email headers. - - If *validate* is true, the metadata will be validated. All exceptions - related to validation will be gathered and raised as an :class:`ExceptionGroup`. - """ - exceptions: list[InvalidMetadata] = [] - raw, unparsed = parse_email(data) - - if validate: - for unparsed_key in unparsed: - if unparsed_key in _EMAIL_TO_RAW_MAPPING: - message = f"{unparsed_key!r} has invalid data" - else: - message = f"unrecognized field: {unparsed_key!r}" - exceptions.append(InvalidMetadata(unparsed_key, message)) - - if exceptions: - raise ExceptionGroup("unparsed", exceptions) - - try: - return cls.from_raw(raw, validate=validate) - except ExceptionGroup as exc_group: - exceptions.extend(exc_group.exceptions) - raise ExceptionGroup("invalid or unparsed metadata", exceptions) from None - - metadata_version: _Validator[_MetadataVersion] = _Validator() - """:external:ref:`core-metadata-metadata-version` - (required; validated to be a valid metadata version)""" - name: _Validator[str] = _Validator() - """:external:ref:`core-metadata-name` - (required; validated using :func:`~packaging.utils.canonicalize_name` and its - *validate* parameter)""" - version: _Validator[version_module.Version] = _Validator() - """:external:ref:`core-metadata-version` (required)""" - dynamic: _Validator[List[str]] = _Validator( - added="2.2", - ) - """:external:ref:`core-metadata-dynamic` - (validated against core metadata field names and lowercased)""" - platforms: _Validator[List[str]] = _Validator() - """:external:ref:`core-metadata-platform`""" - supported_platforms: _Validator[List[str]] = _Validator(added="1.1") - """:external:ref:`core-metadata-supported-platform`""" - summary: _Validator[str] = _Validator() - """:external:ref:`core-metadata-summary` (validated to contain no newlines)""" - description: _Validator[str] = _Validator() # TODO 2.1: can be in body - """:external:ref:`core-metadata-description`""" - description_content_type: _Validator[str] = _Validator(added="2.1") - """:external:ref:`core-metadata-description-content-type` (validated)""" - keywords: _Validator[List[str]] = _Validator() - """:external:ref:`core-metadata-keywords`""" - home_page: _Validator[str] = _Validator() - """:external:ref:`core-metadata-home-page`""" - download_url: _Validator[str] = _Validator(added="1.1") - """:external:ref:`core-metadata-download-url`""" - author: _Validator[str] = _Validator() - """:external:ref:`core-metadata-author`""" - author_email: _Validator[str] = _Validator() - """:external:ref:`core-metadata-author-email`""" - maintainer: _Validator[str] = _Validator(added="1.2") - """:external:ref:`core-metadata-maintainer`""" - maintainer_email: _Validator[str] = _Validator(added="1.2") - """:external:ref:`core-metadata-maintainer-email`""" - license: _Validator[str] = _Validator() - """:external:ref:`core-metadata-license`""" - classifiers: _Validator[List[str]] = _Validator(added="1.1") - """:external:ref:`core-metadata-classifier`""" - requires_dist: _Validator[List[requirements.Requirement]] = _Validator(added="1.2") - """:external:ref:`core-metadata-requires-dist`""" - requires_python: _Validator[specifiers.SpecifierSet] = _Validator(added="1.2") - """:external:ref:`core-metadata-requires-python`""" - # Because `Requires-External` allows for non-PEP 440 version specifiers, we - # don't do any processing on the values. - requires_external: _Validator[List[str]] = _Validator(added="1.2") - """:external:ref:`core-metadata-requires-external`""" - project_urls: _Validator[Dict[str, str]] = _Validator(added="1.2") - """:external:ref:`core-metadata-project-url`""" - # PEP 685 lets us raise an error if an extra doesn't pass `Name` validation - # regardless of metadata version. - provides_extra: _Validator[List[utils.NormalizedName]] = _Validator( - added="2.1", - ) - """:external:ref:`core-metadata-provides-extra`""" - provides_dist: _Validator[List[str]] = _Validator(added="1.2") - """:external:ref:`core-metadata-provides-dist`""" - obsoletes_dist: _Validator[List[str]] = _Validator(added="1.2") - """:external:ref:`core-metadata-obsoletes-dist`""" - requires: _Validator[List[str]] = _Validator(added="1.1") - """``Requires`` (deprecated)""" - provides: _Validator[List[str]] = _Validator(added="1.1") - """``Provides`` (deprecated)""" - obsoletes: _Validator[List[str]] = _Validator(added="1.1") - """``Obsoletes`` (deprecated)""" diff --git a/lib/packaging/py.typed b/lib/packaging/py.typed deleted file mode 100644 index e69de29bb..000000000 diff --git a/lib/packaging/requirements.py b/lib/packaging/requirements.py deleted file mode 100644 index 0c00eba33..000000000 --- a/lib/packaging/requirements.py +++ /dev/null @@ -1,90 +0,0 @@ -# This file is dual licensed under the terms of the Apache License, Version -# 2.0, and the BSD License. See the LICENSE file in the root of this repository -# for complete details. - -from typing import Any, Iterator, Optional, Set - -from ._parser import parse_requirement as _parse_requirement -from ._tokenizer import ParserSyntaxError -from .markers import Marker, _normalize_extra_values -from .specifiers import SpecifierSet -from .utils import canonicalize_name - - -class InvalidRequirement(ValueError): - """ - An invalid requirement was found, users should refer to PEP 508. - """ - - -class Requirement: - """Parse a requirement. - - Parse a given requirement string into its parts, such as name, specifier, - URL, and extras. Raises InvalidRequirement on a badly-formed requirement - string. - """ - - # TODO: Can we test whether something is contained within a requirement? - # If so how do we do that? Do we need to test against the _name_ of - # the thing as well as the version? What about the markers? - # TODO: Can we normalize the name and extra name? - - def __init__(self, requirement_string: str) -> None: - try: - parsed = _parse_requirement(requirement_string) - except ParserSyntaxError as e: - raise InvalidRequirement(str(e)) from e - - self.name: str = parsed.name - self.url: Optional[str] = parsed.url or None - self.extras: Set[str] = set(parsed.extras if parsed.extras else []) - self.specifier: SpecifierSet = SpecifierSet(parsed.specifier) - self.marker: Optional[Marker] = None - if parsed.marker is not None: - self.marker = Marker.__new__(Marker) - self.marker._markers = _normalize_extra_values(parsed.marker) - - def _iter_parts(self, name: str) -> Iterator[str]: - yield name - - if self.extras: - formatted_extras = ",".join(sorted(self.extras)) - yield f"[{formatted_extras}]" - - if self.specifier: - yield str(self.specifier) - - if self.url: - yield f"@ {self.url}" - if self.marker: - yield " " - - if self.marker: - yield f"; {self.marker}" - - def __str__(self) -> str: - return "".join(self._iter_parts(self.name)) - - def __repr__(self) -> str: - return f"" - - def __hash__(self) -> int: - return hash( - ( - self.__class__.__name__, - *self._iter_parts(canonicalize_name(self.name)), - ) - ) - - def __eq__(self, other: Any) -> bool: - if not isinstance(other, Requirement): - return NotImplemented - - return ( - canonicalize_name(self.name) == canonicalize_name(other.name) - and self.extras == other.extras - and self.specifier == other.specifier - and self.url == other.url - and self.marker == other.marker - ) diff --git a/lib/packaging/specifiers.py b/lib/packaging/specifiers.py deleted file mode 100644 index ba8fe37b7..000000000 --- a/lib/packaging/specifiers.py +++ /dev/null @@ -1,1008 +0,0 @@ -# This file is dual licensed under the terms of the Apache License, Version -# 2.0, and the BSD License. See the LICENSE file in the root of this repository -# for complete details. -""" -.. testsetup:: - - from packaging.specifiers import Specifier, SpecifierSet, InvalidSpecifier - from packaging.version import Version -""" - -import abc -import itertools -import re -from typing import ( - Callable, - Iterable, - Iterator, - List, - Optional, - Set, - Tuple, - TypeVar, - Union, -) - -from .utils import canonicalize_version -from .version import Version - -UnparsedVersion = Union[Version, str] -UnparsedVersionVar = TypeVar("UnparsedVersionVar", bound=UnparsedVersion) -CallableOperator = Callable[[Version, str], bool] - - -def _coerce_version(version: UnparsedVersion) -> Version: - if not isinstance(version, Version): - version = Version(version) - return version - - -class InvalidSpecifier(ValueError): - """ - Raised when attempting to create a :class:`Specifier` with a specifier - string that is invalid. - - >>> Specifier("lolwat") - Traceback (most recent call last): - ... - packaging.specifiers.InvalidSpecifier: Invalid specifier: 'lolwat' - """ - - -class BaseSpecifier(metaclass=abc.ABCMeta): - @abc.abstractmethod - def __str__(self) -> str: - """ - Returns the str representation of this Specifier-like object. This - should be representative of the Specifier itself. - """ - - @abc.abstractmethod - def __hash__(self) -> int: - """ - Returns a hash value for this Specifier-like object. - """ - - @abc.abstractmethod - def __eq__(self, other: object) -> bool: - """ - Returns a boolean representing whether or not the two Specifier-like - objects are equal. - - :param other: The other object to check against. - """ - - @property - @abc.abstractmethod - def prereleases(self) -> Optional[bool]: - """Whether or not pre-releases as a whole are allowed. - - This can be set to either ``True`` or ``False`` to explicitly enable or disable - prereleases or it can be set to ``None`` (the default) to use default semantics. - """ - - @prereleases.setter - def prereleases(self, value: bool) -> None: - """Setter for :attr:`prereleases`. - - :param value: The value to set. - """ - - @abc.abstractmethod - def contains(self, item: str, prereleases: Optional[bool] = None) -> bool: - """ - Determines if the given item is contained within this specifier. - """ - - @abc.abstractmethod - def filter( - self, iterable: Iterable[UnparsedVersionVar], prereleases: Optional[bool] = None - ) -> Iterator[UnparsedVersionVar]: - """ - Takes an iterable of items and filters them so that only items which - are contained within this specifier are allowed in it. - """ - - -class Specifier(BaseSpecifier): - """This class abstracts handling of version specifiers. - - .. tip:: - - It is generally not required to instantiate this manually. You should instead - prefer to work with :class:`SpecifierSet` instead, which can parse - comma-separated version specifiers (which is what package metadata contains). - """ - - _operator_regex_str = r""" - (?P(~=|==|!=|<=|>=|<|>|===)) - """ - _version_regex_str = r""" - (?P - (?: - # The identity operators allow for an escape hatch that will - # do an exact string match of the version you wish to install. - # This will not be parsed by PEP 440 and we cannot determine - # any semantic meaning from it. This operator is discouraged - # but included entirely as an escape hatch. - (?<====) # Only match for the identity operator - \s* - [^\s;)]* # The arbitrary version can be just about anything, - # we match everything except for whitespace, a - # semi-colon for marker support, and a closing paren - # since versions can be enclosed in them. - ) - | - (?: - # The (non)equality operators allow for wild card and local - # versions to be specified so we have to define these two - # operators separately to enable that. - (?<===|!=) # Only match for equals and not equals - - \s* - v? - (?:[0-9]+!)? # epoch - [0-9]+(?:\.[0-9]+)* # release - - # You cannot use a wild card and a pre-release, post-release, a dev or - # local version together so group them with a | and make them optional. - (?: - \.\* # Wild card syntax of .* - | - (?: # pre release - [-_\.]? - (alpha|beta|preview|pre|a|b|c|rc) - [-_\.]? - [0-9]* - )? - (?: # post release - (?:-[0-9]+)|(?:[-_\.]?(post|rev|r)[-_\.]?[0-9]*) - )? - (?:[-_\.]?dev[-_\.]?[0-9]*)? # dev release - (?:\+[a-z0-9]+(?:[-_\.][a-z0-9]+)*)? # local - )? - ) - | - (?: - # The compatible operator requires at least two digits in the - # release segment. - (?<=~=) # Only match for the compatible operator - - \s* - v? - (?:[0-9]+!)? # epoch - [0-9]+(?:\.[0-9]+)+ # release (We have a + instead of a *) - (?: # pre release - [-_\.]? - (alpha|beta|preview|pre|a|b|c|rc) - [-_\.]? - [0-9]* - )? - (?: # post release - (?:-[0-9]+)|(?:[-_\.]?(post|rev|r)[-_\.]?[0-9]*) - )? - (?:[-_\.]?dev[-_\.]?[0-9]*)? # dev release - ) - | - (?: - # All other operators only allow a sub set of what the - # (non)equality operators do. Specifically they do not allow - # local versions to be specified nor do they allow the prefix - # matching wild cards. - (?=": "greater_than_equal", - "<": "less_than", - ">": "greater_than", - "===": "arbitrary", - } - - def __init__(self, spec: str = "", prereleases: Optional[bool] = None) -> None: - """Initialize a Specifier instance. - - :param spec: - The string representation of a specifier which will be parsed and - normalized before use. - :param prereleases: - This tells the specifier if it should accept prerelease versions if - applicable or not. The default of ``None`` will autodetect it from the - given specifiers. - :raises InvalidSpecifier: - If the given specifier is invalid (i.e. bad syntax). - """ - match = self._regex.search(spec) - if not match: - raise InvalidSpecifier(f"Invalid specifier: '{spec}'") - - self._spec: Tuple[str, str] = ( - match.group("operator").strip(), - match.group("version").strip(), - ) - - # Store whether or not this Specifier should accept prereleases - self._prereleases = prereleases - - # https://github.com/python/mypy/pull/13475#pullrequestreview-1079784515 - @property # type: ignore[override] - def prereleases(self) -> bool: - # If there is an explicit prereleases set for this, then we'll just - # blindly use that. - if self._prereleases is not None: - return self._prereleases - - # Look at all of our specifiers and determine if they are inclusive - # operators, and if they are if they are including an explicit - # prerelease. - operator, version = self._spec - if operator in ["==", ">=", "<=", "~=", "==="]: - # The == specifier can include a trailing .*, if it does we - # want to remove before parsing. - if operator == "==" and version.endswith(".*"): - version = version[:-2] - - # Parse the version, and if it is a pre-release than this - # specifier allows pre-releases. - if Version(version).is_prerelease: - return True - - return False - - @prereleases.setter - def prereleases(self, value: bool) -> None: - self._prereleases = value - - @property - def operator(self) -> str: - """The operator of this specifier. - - >>> Specifier("==1.2.3").operator - '==' - """ - return self._spec[0] - - @property - def version(self) -> str: - """The version of this specifier. - - >>> Specifier("==1.2.3").version - '1.2.3' - """ - return self._spec[1] - - def __repr__(self) -> str: - """A representation of the Specifier that shows all internal state. - - >>> Specifier('>=1.0.0') - =1.0.0')> - >>> Specifier('>=1.0.0', prereleases=False) - =1.0.0', prereleases=False)> - >>> Specifier('>=1.0.0', prereleases=True) - =1.0.0', prereleases=True)> - """ - pre = ( - f", prereleases={self.prereleases!r}" - if self._prereleases is not None - else "" - ) - - return f"<{self.__class__.__name__}({str(self)!r}{pre})>" - - def __str__(self) -> str: - """A string representation of the Specifier that can be round-tripped. - - >>> str(Specifier('>=1.0.0')) - '>=1.0.0' - >>> str(Specifier('>=1.0.0', prereleases=False)) - '>=1.0.0' - """ - return "{}{}".format(*self._spec) - - @property - def _canonical_spec(self) -> Tuple[str, str]: - canonical_version = canonicalize_version( - self._spec[1], - strip_trailing_zero=(self._spec[0] != "~="), - ) - return self._spec[0], canonical_version - - def __hash__(self) -> int: - return hash(self._canonical_spec) - - def __eq__(self, other: object) -> bool: - """Whether or not the two Specifier-like objects are equal. - - :param other: The other object to check against. - - The value of :attr:`prereleases` is ignored. - - >>> Specifier("==1.2.3") == Specifier("== 1.2.3.0") - True - >>> (Specifier("==1.2.3", prereleases=False) == - ... Specifier("==1.2.3", prereleases=True)) - True - >>> Specifier("==1.2.3") == "==1.2.3" - True - >>> Specifier("==1.2.3") == Specifier("==1.2.4") - False - >>> Specifier("==1.2.3") == Specifier("~=1.2.3") - False - """ - if isinstance(other, str): - try: - other = self.__class__(str(other)) - except InvalidSpecifier: - return NotImplemented - elif not isinstance(other, self.__class__): - return NotImplemented - - return self._canonical_spec == other._canonical_spec - - def _get_operator(self, op: str) -> CallableOperator: - operator_callable: CallableOperator = getattr( - self, f"_compare_{self._operators[op]}" - ) - return operator_callable - - def _compare_compatible(self, prospective: Version, spec: str) -> bool: - - # Compatible releases have an equivalent combination of >= and ==. That - # is that ~=2.2 is equivalent to >=2.2,==2.*. This allows us to - # implement this in terms of the other specifiers instead of - # implementing it ourselves. The only thing we need to do is construct - # the other specifiers. - - # We want everything but the last item in the version, but we want to - # ignore suffix segments. - prefix = ".".join( - list(itertools.takewhile(_is_not_suffix, _version_split(spec)))[:-1] - ) - - # Add the prefix notation to the end of our string - prefix += ".*" - - return self._get_operator(">=")(prospective, spec) and self._get_operator("==")( - prospective, prefix - ) - - def _compare_equal(self, prospective: Version, spec: str) -> bool: - - # We need special logic to handle prefix matching - if spec.endswith(".*"): - # In the case of prefix matching we want to ignore local segment. - normalized_prospective = canonicalize_version( - prospective.public, strip_trailing_zero=False - ) - # Get the normalized version string ignoring the trailing .* - normalized_spec = canonicalize_version(spec[:-2], strip_trailing_zero=False) - # Split the spec out by dots, and pretend that there is an implicit - # dot in between a release segment and a pre-release segment. - split_spec = _version_split(normalized_spec) - - # Split the prospective version out by dots, and pretend that there - # is an implicit dot in between a release segment and a pre-release - # segment. - split_prospective = _version_split(normalized_prospective) - - # 0-pad the prospective version before shortening it to get the correct - # shortened version. - padded_prospective, _ = _pad_version(split_prospective, split_spec) - - # Shorten the prospective version to be the same length as the spec - # so that we can determine if the specifier is a prefix of the - # prospective version or not. - shortened_prospective = padded_prospective[: len(split_spec)] - - return shortened_prospective == split_spec - else: - # Convert our spec string into a Version - spec_version = Version(spec) - - # If the specifier does not have a local segment, then we want to - # act as if the prospective version also does not have a local - # segment. - if not spec_version.local: - prospective = Version(prospective.public) - - return prospective == spec_version - - def _compare_not_equal(self, prospective: Version, spec: str) -> bool: - return not self._compare_equal(prospective, spec) - - def _compare_less_than_equal(self, prospective: Version, spec: str) -> bool: - - # NB: Local version identifiers are NOT permitted in the version - # specifier, so local version labels can be universally removed from - # the prospective version. - return Version(prospective.public) <= Version(spec) - - def _compare_greater_than_equal(self, prospective: Version, spec: str) -> bool: - - # NB: Local version identifiers are NOT permitted in the version - # specifier, so local version labels can be universally removed from - # the prospective version. - return Version(prospective.public) >= Version(spec) - - def _compare_less_than(self, prospective: Version, spec_str: str) -> bool: - - # Convert our spec to a Version instance, since we'll want to work with - # it as a version. - spec = Version(spec_str) - - # Check to see if the prospective version is less than the spec - # version. If it's not we can short circuit and just return False now - # instead of doing extra unneeded work. - if not prospective < spec: - return False - - # This special case is here so that, unless the specifier itself - # includes is a pre-release version, that we do not accept pre-release - # versions for the version mentioned in the specifier (e.g. <3.1 should - # not match 3.1.dev0, but should match 3.0.dev0). - if not spec.is_prerelease and prospective.is_prerelease: - if Version(prospective.base_version) == Version(spec.base_version): - return False - - # If we've gotten to here, it means that prospective version is both - # less than the spec version *and* it's not a pre-release of the same - # version in the spec. - return True - - def _compare_greater_than(self, prospective: Version, spec_str: str) -> bool: - - # Convert our spec to a Version instance, since we'll want to work with - # it as a version. - spec = Version(spec_str) - - # Check to see if the prospective version is greater than the spec - # version. If it's not we can short circuit and just return False now - # instead of doing extra unneeded work. - if not prospective > spec: - return False - - # This special case is here so that, unless the specifier itself - # includes is a post-release version, that we do not accept - # post-release versions for the version mentioned in the specifier - # (e.g. >3.1 should not match 3.0.post0, but should match 3.2.post0). - if not spec.is_postrelease and prospective.is_postrelease: - if Version(prospective.base_version) == Version(spec.base_version): - return False - - # Ensure that we do not allow a local version of the version mentioned - # in the specifier, which is technically greater than, to match. - if prospective.local is not None: - if Version(prospective.base_version) == Version(spec.base_version): - return False - - # If we've gotten to here, it means that prospective version is both - # greater than the spec version *and* it's not a pre-release of the - # same version in the spec. - return True - - def _compare_arbitrary(self, prospective: Version, spec: str) -> bool: - return str(prospective).lower() == str(spec).lower() - - def __contains__(self, item: Union[str, Version]) -> bool: - """Return whether or not the item is contained in this specifier. - - :param item: The item to check for. - - This is used for the ``in`` operator and behaves the same as - :meth:`contains` with no ``prereleases`` argument passed. - - >>> "1.2.3" in Specifier(">=1.2.3") - True - >>> Version("1.2.3") in Specifier(">=1.2.3") - True - >>> "1.0.0" in Specifier(">=1.2.3") - False - >>> "1.3.0a1" in Specifier(">=1.2.3") - False - >>> "1.3.0a1" in Specifier(">=1.2.3", prereleases=True) - True - """ - return self.contains(item) - - def contains( - self, item: UnparsedVersion, prereleases: Optional[bool] = None - ) -> bool: - """Return whether or not the item is contained in this specifier. - - :param item: - The item to check for, which can be a version string or a - :class:`Version` instance. - :param prereleases: - Whether or not to match prereleases with this Specifier. If set to - ``None`` (the default), it uses :attr:`prereleases` to determine - whether or not prereleases are allowed. - - >>> Specifier(">=1.2.3").contains("1.2.3") - True - >>> Specifier(">=1.2.3").contains(Version("1.2.3")) - True - >>> Specifier(">=1.2.3").contains("1.0.0") - False - >>> Specifier(">=1.2.3").contains("1.3.0a1") - False - >>> Specifier(">=1.2.3", prereleases=True).contains("1.3.0a1") - True - >>> Specifier(">=1.2.3").contains("1.3.0a1", prereleases=True) - True - """ - - # Determine if prereleases are to be allowed or not. - if prereleases is None: - prereleases = self.prereleases - - # Normalize item to a Version, this allows us to have a shortcut for - # "2.0" in Specifier(">=2") - normalized_item = _coerce_version(item) - - # Determine if we should be supporting prereleases in this specifier - # or not, if we do not support prereleases than we can short circuit - # logic if this version is a prereleases. - if normalized_item.is_prerelease and not prereleases: - return False - - # Actually do the comparison to determine if this item is contained - # within this Specifier or not. - operator_callable: CallableOperator = self._get_operator(self.operator) - return operator_callable(normalized_item, self.version) - - def filter( - self, iterable: Iterable[UnparsedVersionVar], prereleases: Optional[bool] = None - ) -> Iterator[UnparsedVersionVar]: - """Filter items in the given iterable, that match the specifier. - - :param iterable: - An iterable that can contain version strings and :class:`Version` instances. - The items in the iterable will be filtered according to the specifier. - :param prereleases: - Whether or not to allow prereleases in the returned iterator. If set to - ``None`` (the default), it will be intelligently decide whether to allow - prereleases or not (based on the :attr:`prereleases` attribute, and - whether the only versions matching are prereleases). - - This method is smarter than just ``filter(Specifier().contains, [...])`` - because it implements the rule from :pep:`440` that a prerelease item - SHOULD be accepted if no other versions match the given specifier. - - >>> list(Specifier(">=1.2.3").filter(["1.2", "1.3", "1.5a1"])) - ['1.3'] - >>> list(Specifier(">=1.2.3").filter(["1.2", "1.2.3", "1.3", Version("1.4")])) - ['1.2.3', '1.3', ] - >>> list(Specifier(">=1.2.3").filter(["1.2", "1.5a1"])) - ['1.5a1'] - >>> list(Specifier(">=1.2.3").filter(["1.3", "1.5a1"], prereleases=True)) - ['1.3', '1.5a1'] - >>> list(Specifier(">=1.2.3", prereleases=True).filter(["1.3", "1.5a1"])) - ['1.3', '1.5a1'] - """ - - yielded = False - found_prereleases = [] - - kw = {"prereleases": prereleases if prereleases is not None else True} - - # Attempt to iterate over all the values in the iterable and if any of - # them match, yield them. - for version in iterable: - parsed_version = _coerce_version(version) - - if self.contains(parsed_version, **kw): - # If our version is a prerelease, and we were not set to allow - # prereleases, then we'll store it for later in case nothing - # else matches this specifier. - if parsed_version.is_prerelease and not ( - prereleases or self.prereleases - ): - found_prereleases.append(version) - # Either this is not a prerelease, or we should have been - # accepting prereleases from the beginning. - else: - yielded = True - yield version - - # Now that we've iterated over everything, determine if we've yielded - # any values, and if we have not and we have any prereleases stored up - # then we will go ahead and yield the prereleases. - if not yielded and found_prereleases: - for version in found_prereleases: - yield version - - -_prefix_regex = re.compile(r"^([0-9]+)((?:a|b|c|rc)[0-9]+)$") - - -def _version_split(version: str) -> List[str]: - result: List[str] = [] - for item in version.split("."): - match = _prefix_regex.search(item) - if match: - result.extend(match.groups()) - else: - result.append(item) - return result - - -def _is_not_suffix(segment: str) -> bool: - return not any( - segment.startswith(prefix) for prefix in ("dev", "a", "b", "rc", "post") - ) - - -def _pad_version(left: List[str], right: List[str]) -> Tuple[List[str], List[str]]: - left_split, right_split = [], [] - - # Get the release segment of our versions - left_split.append(list(itertools.takewhile(lambda x: x.isdigit(), left))) - right_split.append(list(itertools.takewhile(lambda x: x.isdigit(), right))) - - # Get the rest of our versions - left_split.append(left[len(left_split[0]) :]) - right_split.append(right[len(right_split[0]) :]) - - # Insert our padding - left_split.insert(1, ["0"] * max(0, len(right_split[0]) - len(left_split[0]))) - right_split.insert(1, ["0"] * max(0, len(left_split[0]) - len(right_split[0]))) - - return (list(itertools.chain(*left_split)), list(itertools.chain(*right_split))) - - -class SpecifierSet(BaseSpecifier): - """This class abstracts handling of a set of version specifiers. - - It can be passed a single specifier (``>=3.0``), a comma-separated list of - specifiers (``>=3.0,!=3.1``), or no specifier at all. - """ - - def __init__( - self, specifiers: str = "", prereleases: Optional[bool] = None - ) -> None: - """Initialize a SpecifierSet instance. - - :param specifiers: - The string representation of a specifier or a comma-separated list of - specifiers which will be parsed and normalized before use. - :param prereleases: - This tells the SpecifierSet if it should accept prerelease versions if - applicable or not. The default of ``None`` will autodetect it from the - given specifiers. - - :raises InvalidSpecifier: - If the given ``specifiers`` are not parseable than this exception will be - raised. - """ - - # Split on `,` to break each individual specifier into it's own item, and - # strip each item to remove leading/trailing whitespace. - split_specifiers = [s.strip() for s in specifiers.split(",") if s.strip()] - - # Parsed each individual specifier, attempting first to make it a - # Specifier. - parsed: Set[Specifier] = set() - for specifier in split_specifiers: - parsed.add(Specifier(specifier)) - - # Turn our parsed specifiers into a frozen set and save them for later. - self._specs = frozenset(parsed) - - # Store our prereleases value so we can use it later to determine if - # we accept prereleases or not. - self._prereleases = prereleases - - @property - def prereleases(self) -> Optional[bool]: - # If we have been given an explicit prerelease modifier, then we'll - # pass that through here. - if self._prereleases is not None: - return self._prereleases - - # If we don't have any specifiers, and we don't have a forced value, - # then we'll just return None since we don't know if this should have - # pre-releases or not. - if not self._specs: - return None - - # Otherwise we'll see if any of the given specifiers accept - # prereleases, if any of them do we'll return True, otherwise False. - return any(s.prereleases for s in self._specs) - - @prereleases.setter - def prereleases(self, value: bool) -> None: - self._prereleases = value - - def __repr__(self) -> str: - """A representation of the specifier set that shows all internal state. - - Note that the ordering of the individual specifiers within the set may not - match the input string. - - >>> SpecifierSet('>=1.0.0,!=2.0.0') - =1.0.0')> - >>> SpecifierSet('>=1.0.0,!=2.0.0', prereleases=False) - =1.0.0', prereleases=False)> - >>> SpecifierSet('>=1.0.0,!=2.0.0', prereleases=True) - =1.0.0', prereleases=True)> - """ - pre = ( - f", prereleases={self.prereleases!r}" - if self._prereleases is not None - else "" - ) - - return f"" - - def __str__(self) -> str: - """A string representation of the specifier set that can be round-tripped. - - Note that the ordering of the individual specifiers within the set may not - match the input string. - - >>> str(SpecifierSet(">=1.0.0,!=1.0.1")) - '!=1.0.1,>=1.0.0' - >>> str(SpecifierSet(">=1.0.0,!=1.0.1", prereleases=False)) - '!=1.0.1,>=1.0.0' - """ - return ",".join(sorted(str(s) for s in self._specs)) - - def __hash__(self) -> int: - return hash(self._specs) - - def __and__(self, other: Union["SpecifierSet", str]) -> "SpecifierSet": - """Return a SpecifierSet which is a combination of the two sets. - - :param other: The other object to combine with. - - >>> SpecifierSet(">=1.0.0,!=1.0.1") & '<=2.0.0,!=2.0.1' - =1.0.0')> - >>> SpecifierSet(">=1.0.0,!=1.0.1") & SpecifierSet('<=2.0.0,!=2.0.1') - =1.0.0')> - """ - if isinstance(other, str): - other = SpecifierSet(other) - elif not isinstance(other, SpecifierSet): - return NotImplemented - - specifier = SpecifierSet() - specifier._specs = frozenset(self._specs | other._specs) - - if self._prereleases is None and other._prereleases is not None: - specifier._prereleases = other._prereleases - elif self._prereleases is not None and other._prereleases is None: - specifier._prereleases = self._prereleases - elif self._prereleases == other._prereleases: - specifier._prereleases = self._prereleases - else: - raise ValueError( - "Cannot combine SpecifierSets with True and False prerelease " - "overrides." - ) - - return specifier - - def __eq__(self, other: object) -> bool: - """Whether or not the two SpecifierSet-like objects are equal. - - :param other: The other object to check against. - - The value of :attr:`prereleases` is ignored. - - >>> SpecifierSet(">=1.0.0,!=1.0.1") == SpecifierSet(">=1.0.0,!=1.0.1") - True - >>> (SpecifierSet(">=1.0.0,!=1.0.1", prereleases=False) == - ... SpecifierSet(">=1.0.0,!=1.0.1", prereleases=True)) - True - >>> SpecifierSet(">=1.0.0,!=1.0.1") == ">=1.0.0,!=1.0.1" - True - >>> SpecifierSet(">=1.0.0,!=1.0.1") == SpecifierSet(">=1.0.0") - False - >>> SpecifierSet(">=1.0.0,!=1.0.1") == SpecifierSet(">=1.0.0,!=1.0.2") - False - """ - if isinstance(other, (str, Specifier)): - other = SpecifierSet(str(other)) - elif not isinstance(other, SpecifierSet): - return NotImplemented - - return self._specs == other._specs - - def __len__(self) -> int: - """Returns the number of specifiers in this specifier set.""" - return len(self._specs) - - def __iter__(self) -> Iterator[Specifier]: - """ - Returns an iterator over all the underlying :class:`Specifier` instances - in this specifier set. - - >>> sorted(SpecifierSet(">=1.0.0,!=1.0.1"), key=str) - [, =1.0.0')>] - """ - return iter(self._specs) - - def __contains__(self, item: UnparsedVersion) -> bool: - """Return whether or not the item is contained in this specifier. - - :param item: The item to check for. - - This is used for the ``in`` operator and behaves the same as - :meth:`contains` with no ``prereleases`` argument passed. - - >>> "1.2.3" in SpecifierSet(">=1.0.0,!=1.0.1") - True - >>> Version("1.2.3") in SpecifierSet(">=1.0.0,!=1.0.1") - True - >>> "1.0.1" in SpecifierSet(">=1.0.0,!=1.0.1") - False - >>> "1.3.0a1" in SpecifierSet(">=1.0.0,!=1.0.1") - False - >>> "1.3.0a1" in SpecifierSet(">=1.0.0,!=1.0.1", prereleases=True) - True - """ - return self.contains(item) - - def contains( - self, - item: UnparsedVersion, - prereleases: Optional[bool] = None, - installed: Optional[bool] = None, - ) -> bool: - """Return whether or not the item is contained in this SpecifierSet. - - :param item: - The item to check for, which can be a version string or a - :class:`Version` instance. - :param prereleases: - Whether or not to match prereleases with this SpecifierSet. If set to - ``None`` (the default), it uses :attr:`prereleases` to determine - whether or not prereleases are allowed. - - >>> SpecifierSet(">=1.0.0,!=1.0.1").contains("1.2.3") - True - >>> SpecifierSet(">=1.0.0,!=1.0.1").contains(Version("1.2.3")) - True - >>> SpecifierSet(">=1.0.0,!=1.0.1").contains("1.0.1") - False - >>> SpecifierSet(">=1.0.0,!=1.0.1").contains("1.3.0a1") - False - >>> SpecifierSet(">=1.0.0,!=1.0.1", prereleases=True).contains("1.3.0a1") - True - >>> SpecifierSet(">=1.0.0,!=1.0.1").contains("1.3.0a1", prereleases=True) - True - """ - # Ensure that our item is a Version instance. - if not isinstance(item, Version): - item = Version(item) - - # Determine if we're forcing a prerelease or not, if we're not forcing - # one for this particular filter call, then we'll use whatever the - # SpecifierSet thinks for whether or not we should support prereleases. - if prereleases is None: - prereleases = self.prereleases - - # We can determine if we're going to allow pre-releases by looking to - # see if any of the underlying items supports them. If none of them do - # and this item is a pre-release then we do not allow it and we can - # short circuit that here. - # Note: This means that 1.0.dev1 would not be contained in something - # like >=1.0.devabc however it would be in >=1.0.debabc,>0.0.dev0 - if not prereleases and item.is_prerelease: - return False - - if installed and item.is_prerelease: - item = Version(item.base_version) - - # We simply dispatch to the underlying specs here to make sure that the - # given version is contained within all of them. - # Note: This use of all() here means that an empty set of specifiers - # will always return True, this is an explicit design decision. - return all(s.contains(item, prereleases=prereleases) for s in self._specs) - - def filter( - self, iterable: Iterable[UnparsedVersionVar], prereleases: Optional[bool] = None - ) -> Iterator[UnparsedVersionVar]: - """Filter items in the given iterable, that match the specifiers in this set. - - :param iterable: - An iterable that can contain version strings and :class:`Version` instances. - The items in the iterable will be filtered according to the specifier. - :param prereleases: - Whether or not to allow prereleases in the returned iterator. If set to - ``None`` (the default), it will be intelligently decide whether to allow - prereleases or not (based on the :attr:`prereleases` attribute, and - whether the only versions matching are prereleases). - - This method is smarter than just ``filter(SpecifierSet(...).contains, [...])`` - because it implements the rule from :pep:`440` that a prerelease item - SHOULD be accepted if no other versions match the given specifier. - - >>> list(SpecifierSet(">=1.2.3").filter(["1.2", "1.3", "1.5a1"])) - ['1.3'] - >>> list(SpecifierSet(">=1.2.3").filter(["1.2", "1.3", Version("1.4")])) - ['1.3', ] - >>> list(SpecifierSet(">=1.2.3").filter(["1.2", "1.5a1"])) - [] - >>> list(SpecifierSet(">=1.2.3").filter(["1.3", "1.5a1"], prereleases=True)) - ['1.3', '1.5a1'] - >>> list(SpecifierSet(">=1.2.3", prereleases=True).filter(["1.3", "1.5a1"])) - ['1.3', '1.5a1'] - - An "empty" SpecifierSet will filter items based on the presence of prerelease - versions in the set. - - >>> list(SpecifierSet("").filter(["1.3", "1.5a1"])) - ['1.3'] - >>> list(SpecifierSet("").filter(["1.5a1"])) - ['1.5a1'] - >>> list(SpecifierSet("", prereleases=True).filter(["1.3", "1.5a1"])) - ['1.3', '1.5a1'] - >>> list(SpecifierSet("").filter(["1.3", "1.5a1"], prereleases=True)) - ['1.3', '1.5a1'] - """ - # Determine if we're forcing a prerelease or not, if we're not forcing - # one for this particular filter call, then we'll use whatever the - # SpecifierSet thinks for whether or not we should support prereleases. - if prereleases is None: - prereleases = self.prereleases - - # If we have any specifiers, then we want to wrap our iterable in the - # filter method for each one, this will act as a logical AND amongst - # each specifier. - if self._specs: - for spec in self._specs: - iterable = spec.filter(iterable, prereleases=bool(prereleases)) - return iter(iterable) - # If we do not have any specifiers, then we need to have a rough filter - # which will filter out any pre-releases, unless there are no final - # releases. - else: - filtered: List[UnparsedVersionVar] = [] - found_prereleases: List[UnparsedVersionVar] = [] - - for item in iterable: - parsed_version = _coerce_version(item) - - # Store any item which is a pre-release for later unless we've - # already found a final version or we are accepting prereleases - if parsed_version.is_prerelease and not prereleases: - if not filtered: - found_prereleases.append(item) - else: - filtered.append(item) - - # If we've found no items except for pre-releases, then we'll go - # ahead and use the pre-releases - if not filtered and found_prereleases and prereleases is None: - return iter(found_prereleases) - - return iter(filtered) diff --git a/lib/packaging/tags.py b/lib/packaging/tags.py deleted file mode 100644 index 37f33b1ef..000000000 --- a/lib/packaging/tags.py +++ /dev/null @@ -1,553 +0,0 @@ -# This file is dual licensed under the terms of the Apache License, Version -# 2.0, and the BSD License. See the LICENSE file in the root of this repository -# for complete details. - -import logging -import platform -import struct -import subprocess -import sys -import sysconfig -from importlib.machinery import EXTENSION_SUFFIXES -from typing import ( - Dict, - FrozenSet, - Iterable, - Iterator, - List, - Optional, - Sequence, - Tuple, - Union, - cast, -) - -from . import _manylinux, _musllinux - -logger = logging.getLogger(__name__) - -PythonVersion = Sequence[int] -MacVersion = Tuple[int, int] - -INTERPRETER_SHORT_NAMES: Dict[str, str] = { - "python": "py", # Generic. - "cpython": "cp", - "pypy": "pp", - "ironpython": "ip", - "jython": "jy", -} - - -_32_BIT_INTERPRETER = struct.calcsize("P") == 4 - - -class Tag: - """ - A representation of the tag triple for a wheel. - - Instances are considered immutable and thus are hashable. Equality checking - is also supported. - """ - - __slots__ = ["_interpreter", "_abi", "_platform", "_hash"] - - def __init__(self, interpreter: str, abi: str, platform: str) -> None: - self._interpreter = interpreter.lower() - self._abi = abi.lower() - self._platform = platform.lower() - # The __hash__ of every single element in a Set[Tag] will be evaluated each time - # that a set calls its `.disjoint()` method, which may be called hundreds of - # times when scanning a page of links for packages with tags matching that - # Set[Tag]. Pre-computing the value here produces significant speedups for - # downstream consumers. - self._hash = hash((self._interpreter, self._abi, self._platform)) - - @property - def interpreter(self) -> str: - return self._interpreter - - @property - def abi(self) -> str: - return self._abi - - @property - def platform(self) -> str: - return self._platform - - def __eq__(self, other: object) -> bool: - if not isinstance(other, Tag): - return NotImplemented - - return ( - (self._hash == other._hash) # Short-circuit ASAP for perf reasons. - and (self._platform == other._platform) - and (self._abi == other._abi) - and (self._interpreter == other._interpreter) - ) - - def __hash__(self) -> int: - return self._hash - - def __str__(self) -> str: - return f"{self._interpreter}-{self._abi}-{self._platform}" - - def __repr__(self) -> str: - return f"<{self} @ {id(self)}>" - - -def parse_tag(tag: str) -> FrozenSet[Tag]: - """ - Parses the provided tag (e.g. `py3-none-any`) into a frozenset of Tag instances. - - Returning a set is required due to the possibility that the tag is a - compressed tag set. - """ - tags = set() - interpreters, abis, platforms = tag.split("-") - for interpreter in interpreters.split("."): - for abi in abis.split("."): - for platform_ in platforms.split("."): - tags.add(Tag(interpreter, abi, platform_)) - return frozenset(tags) - - -def _get_config_var(name: str, warn: bool = False) -> Union[int, str, None]: - value: Union[int, str, None] = sysconfig.get_config_var(name) - if value is None and warn: - logger.debug( - "Config variable '%s' is unset, Python ABI tag may be incorrect", name - ) - return value - - -def _normalize_string(string: str) -> str: - return string.replace(".", "_").replace("-", "_").replace(" ", "_") - - -def _abi3_applies(python_version: PythonVersion) -> bool: - """ - Determine if the Python version supports abi3. - - PEP 384 was first implemented in Python 3.2. - """ - return len(python_version) > 1 and tuple(python_version) >= (3, 2) - - -def _cpython_abis(py_version: PythonVersion, warn: bool = False) -> List[str]: - py_version = tuple(py_version) # To allow for version comparison. - abis = [] - version = _version_nodot(py_version[:2]) - debug = pymalloc = ucs4 = "" - with_debug = _get_config_var("Py_DEBUG", warn) - has_refcount = hasattr(sys, "gettotalrefcount") - # Windows doesn't set Py_DEBUG, so checking for support of debug-compiled - # extension modules is the best option. - # https://github.com/pypa/pip/issues/3383#issuecomment-173267692 - has_ext = "_d.pyd" in EXTENSION_SUFFIXES - if with_debug or (with_debug is None and (has_refcount or has_ext)): - debug = "d" - if py_version < (3, 8): - with_pymalloc = _get_config_var("WITH_PYMALLOC", warn) - if with_pymalloc or with_pymalloc is None: - pymalloc = "m" - if py_version < (3, 3): - unicode_size = _get_config_var("Py_UNICODE_SIZE", warn) - if unicode_size == 4 or ( - unicode_size is None and sys.maxunicode == 0x10FFFF - ): - ucs4 = "u" - elif debug: - # Debug builds can also load "normal" extension modules. - # We can also assume no UCS-4 or pymalloc requirement. - abis.append(f"cp{version}") - abis.insert( - 0, - "cp{version}{debug}{pymalloc}{ucs4}".format( - version=version, debug=debug, pymalloc=pymalloc, ucs4=ucs4 - ), - ) - return abis - - -def cpython_tags( - python_version: Optional[PythonVersion] = None, - abis: Optional[Iterable[str]] = None, - platforms: Optional[Iterable[str]] = None, - *, - warn: bool = False, -) -> Iterator[Tag]: - """ - Yields the tags for a CPython interpreter. - - The tags consist of: - - cp-- - - cp-abi3- - - cp-none- - - cp-abi3- # Older Python versions down to 3.2. - - If python_version only specifies a major version then user-provided ABIs and - the 'none' ABItag will be used. - - If 'abi3' or 'none' are specified in 'abis' then they will be yielded at - their normal position and not at the beginning. - """ - if not python_version: - python_version = sys.version_info[:2] - - interpreter = f"cp{_version_nodot(python_version[:2])}" - - if abis is None: - if len(python_version) > 1: - abis = _cpython_abis(python_version, warn) - else: - abis = [] - abis = list(abis) - # 'abi3' and 'none' are explicitly handled later. - for explicit_abi in ("abi3", "none"): - try: - abis.remove(explicit_abi) - except ValueError: - pass - - platforms = list(platforms or platform_tags()) - for abi in abis: - for platform_ in platforms: - yield Tag(interpreter, abi, platform_) - if _abi3_applies(python_version): - yield from (Tag(interpreter, "abi3", platform_) for platform_ in platforms) - yield from (Tag(interpreter, "none", platform_) for platform_ in platforms) - - if _abi3_applies(python_version): - for minor_version in range(python_version[1] - 1, 1, -1): - for platform_ in platforms: - interpreter = "cp{version}".format( - version=_version_nodot((python_version[0], minor_version)) - ) - yield Tag(interpreter, "abi3", platform_) - - -def _generic_abi() -> List[str]: - """ - Return the ABI tag based on EXT_SUFFIX. - """ - # The following are examples of `EXT_SUFFIX`. - # We want to keep the parts which are related to the ABI and remove the - # parts which are related to the platform: - # - linux: '.cpython-310-x86_64-linux-gnu.so' => cp310 - # - mac: '.cpython-310-darwin.so' => cp310 - # - win: '.cp310-win_amd64.pyd' => cp310 - # - win: '.pyd' => cp37 (uses _cpython_abis()) - # - pypy: '.pypy38-pp73-x86_64-linux-gnu.so' => pypy38_pp73 - # - graalpy: '.graalpy-38-native-x86_64-darwin.dylib' - # => graalpy_38_native - - ext_suffix = _get_config_var("EXT_SUFFIX", warn=True) - if not isinstance(ext_suffix, str) or ext_suffix[0] != ".": - raise SystemError("invalid sysconfig.get_config_var('EXT_SUFFIX')") - parts = ext_suffix.split(".") - if len(parts) < 3: - # CPython3.7 and earlier uses ".pyd" on Windows. - return _cpython_abis(sys.version_info[:2]) - soabi = parts[1] - if soabi.startswith("cpython"): - # non-windows - abi = "cp" + soabi.split("-")[1] - elif soabi.startswith("cp"): - # windows - abi = soabi.split("-")[0] - elif soabi.startswith("pypy"): - abi = "-".join(soabi.split("-")[:2]) - elif soabi.startswith("graalpy"): - abi = "-".join(soabi.split("-")[:3]) - elif soabi: - # pyston, ironpython, others? - abi = soabi - else: - return [] - return [_normalize_string(abi)] - - -def generic_tags( - interpreter: Optional[str] = None, - abis: Optional[Iterable[str]] = None, - platforms: Optional[Iterable[str]] = None, - *, - warn: bool = False, -) -> Iterator[Tag]: - """ - Yields the tags for a generic interpreter. - - The tags consist of: - - -- - - The "none" ABI will be added if it was not explicitly provided. - """ - if not interpreter: - interp_name = interpreter_name() - interp_version = interpreter_version(warn=warn) - interpreter = "".join([interp_name, interp_version]) - if abis is None: - abis = _generic_abi() - else: - abis = list(abis) - platforms = list(platforms or platform_tags()) - if "none" not in abis: - abis.append("none") - for abi in abis: - for platform_ in platforms: - yield Tag(interpreter, abi, platform_) - - -def _py_interpreter_range(py_version: PythonVersion) -> Iterator[str]: - """ - Yields Python versions in descending order. - - After the latest version, the major-only version will be yielded, and then - all previous versions of that major version. - """ - if len(py_version) > 1: - yield f"py{_version_nodot(py_version[:2])}" - yield f"py{py_version[0]}" - if len(py_version) > 1: - for minor in range(py_version[1] - 1, -1, -1): - yield f"py{_version_nodot((py_version[0], minor))}" - - -def compatible_tags( - python_version: Optional[PythonVersion] = None, - interpreter: Optional[str] = None, - platforms: Optional[Iterable[str]] = None, -) -> Iterator[Tag]: - """ - Yields the sequence of tags that are compatible with a specific version of Python. - - The tags consist of: - - py*-none- - - -none-any # ... if `interpreter` is provided. - - py*-none-any - """ - if not python_version: - python_version = sys.version_info[:2] - platforms = list(platforms or platform_tags()) - for version in _py_interpreter_range(python_version): - for platform_ in platforms: - yield Tag(version, "none", platform_) - if interpreter: - yield Tag(interpreter, "none", "any") - for version in _py_interpreter_range(python_version): - yield Tag(version, "none", "any") - - -def _mac_arch(arch: str, is_32bit: bool = _32_BIT_INTERPRETER) -> str: - if not is_32bit: - return arch - - if arch.startswith("ppc"): - return "ppc" - - return "i386" - - -def _mac_binary_formats(version: MacVersion, cpu_arch: str) -> List[str]: - formats = [cpu_arch] - if cpu_arch == "x86_64": - if version < (10, 4): - return [] - formats.extend(["intel", "fat64", "fat32"]) - - elif cpu_arch == "i386": - if version < (10, 4): - return [] - formats.extend(["intel", "fat32", "fat"]) - - elif cpu_arch == "ppc64": - # TODO: Need to care about 32-bit PPC for ppc64 through 10.2? - if version > (10, 5) or version < (10, 4): - return [] - formats.append("fat64") - - elif cpu_arch == "ppc": - if version > (10, 6): - return [] - formats.extend(["fat32", "fat"]) - - if cpu_arch in {"arm64", "x86_64"}: - formats.append("universal2") - - if cpu_arch in {"x86_64", "i386", "ppc64", "ppc", "intel"}: - formats.append("universal") - - return formats - - -def mac_platforms( - version: Optional[MacVersion] = None, arch: Optional[str] = None -) -> Iterator[str]: - """ - Yields the platform tags for a macOS system. - - The `version` parameter is a two-item tuple specifying the macOS version to - generate platform tags for. The `arch` parameter is the CPU architecture to - generate platform tags for. Both parameters default to the appropriate value - for the current system. - """ - version_str, _, cpu_arch = platform.mac_ver() - if version is None: - version = cast("MacVersion", tuple(map(int, version_str.split(".")[:2]))) - if version == (10, 16): - # When built against an older macOS SDK, Python will report macOS 10.16 - # instead of the real version. - version_str = subprocess.run( - [ - sys.executable, - "-sS", - "-c", - "import platform; print(platform.mac_ver()[0])", - ], - check=True, - env={"SYSTEM_VERSION_COMPAT": "0"}, - stdout=subprocess.PIPE, - text=True, - ).stdout - version = cast("MacVersion", tuple(map(int, version_str.split(".")[:2]))) - else: - version = version - if arch is None: - arch = _mac_arch(cpu_arch) - else: - arch = arch - - if (10, 0) <= version and version < (11, 0): - # Prior to Mac OS 11, each yearly release of Mac OS bumped the - # "minor" version number. The major version was always 10. - for minor_version in range(version[1], -1, -1): - compat_version = 10, minor_version - binary_formats = _mac_binary_formats(compat_version, arch) - for binary_format in binary_formats: - yield "macosx_{major}_{minor}_{binary_format}".format( - major=10, minor=minor_version, binary_format=binary_format - ) - - if version >= (11, 0): - # Starting with Mac OS 11, each yearly release bumps the major version - # number. The minor versions are now the midyear updates. - for major_version in range(version[0], 10, -1): - compat_version = major_version, 0 - binary_formats = _mac_binary_formats(compat_version, arch) - for binary_format in binary_formats: - yield "macosx_{major}_{minor}_{binary_format}".format( - major=major_version, minor=0, binary_format=binary_format - ) - - if version >= (11, 0): - # Mac OS 11 on x86_64 is compatible with binaries from previous releases. - # Arm64 support was introduced in 11.0, so no Arm binaries from previous - # releases exist. - # - # However, the "universal2" binary format can have a - # macOS version earlier than 11.0 when the x86_64 part of the binary supports - # that version of macOS. - if arch == "x86_64": - for minor_version in range(16, 3, -1): - compat_version = 10, minor_version - binary_formats = _mac_binary_formats(compat_version, arch) - for binary_format in binary_formats: - yield "macosx_{major}_{minor}_{binary_format}".format( - major=compat_version[0], - minor=compat_version[1], - binary_format=binary_format, - ) - else: - for minor_version in range(16, 3, -1): - compat_version = 10, minor_version - binary_format = "universal2" - yield "macosx_{major}_{minor}_{binary_format}".format( - major=compat_version[0], - minor=compat_version[1], - binary_format=binary_format, - ) - - -def _linux_platforms(is_32bit: bool = _32_BIT_INTERPRETER) -> Iterator[str]: - linux = _normalize_string(sysconfig.get_platform()) - if not linux.startswith("linux_"): - # we should never be here, just yield the sysconfig one and return - yield linux - return - if is_32bit: - if linux == "linux_x86_64": - linux = "linux_i686" - elif linux == "linux_aarch64": - linux = "linux_armv8l" - _, arch = linux.split("_", 1) - archs = {"armv8l": ["armv8l", "armv7l"]}.get(arch, [arch]) - yield from _manylinux.platform_tags(archs) - yield from _musllinux.platform_tags(archs) - for arch in archs: - yield f"linux_{arch}" - - -def _generic_platforms() -> Iterator[str]: - yield _normalize_string(sysconfig.get_platform()) - - -def platform_tags() -> Iterator[str]: - """ - Provides the platform tags for this installation. - """ - if platform.system() == "Darwin": - return mac_platforms() - elif platform.system() == "Linux": - return _linux_platforms() - else: - return _generic_platforms() - - -def interpreter_name() -> str: - """ - Returns the name of the running interpreter. - - Some implementations have a reserved, two-letter abbreviation which will - be returned when appropriate. - """ - name = sys.implementation.name - return INTERPRETER_SHORT_NAMES.get(name) or name - - -def interpreter_version(*, warn: bool = False) -> str: - """ - Returns the version of the running interpreter. - """ - version = _get_config_var("py_version_nodot", warn=warn) - if version: - version = str(version) - else: - version = _version_nodot(sys.version_info[:2]) - return version - - -def _version_nodot(version: PythonVersion) -> str: - return "".join(map(str, version)) - - -def sys_tags(*, warn: bool = False) -> Iterator[Tag]: - """ - Returns the sequence of tag triples for the running interpreter. - - The order of the sequence corresponds to priority order for the - interpreter, from most to least important. - """ - - interp_name = interpreter_name() - if interp_name == "cp": - yield from cpython_tags(warn=warn) - else: - yield from generic_tags() - - if interp_name == "pp": - interp = "pp3" - elif interp_name == "cp": - interp = "cp" + interpreter_version(warn=warn) - else: - interp = None - yield from compatible_tags(interpreter=interp) diff --git a/lib/packaging/utils.py b/lib/packaging/utils.py deleted file mode 100644 index c2c2f75aa..000000000 --- a/lib/packaging/utils.py +++ /dev/null @@ -1,172 +0,0 @@ -# This file is dual licensed under the terms of the Apache License, Version -# 2.0, and the BSD License. See the LICENSE file in the root of this repository -# for complete details. - -import re -from typing import FrozenSet, NewType, Tuple, Union, cast - -from .tags import Tag, parse_tag -from .version import InvalidVersion, Version - -BuildTag = Union[Tuple[()], Tuple[int, str]] -NormalizedName = NewType("NormalizedName", str) - - -class InvalidName(ValueError): - """ - An invalid distribution name; users should refer to the packaging user guide. - """ - - -class InvalidWheelFilename(ValueError): - """ - An invalid wheel filename was found, users should refer to PEP 427. - """ - - -class InvalidSdistFilename(ValueError): - """ - An invalid sdist filename was found, users should refer to the packaging user guide. - """ - - -# Core metadata spec for `Name` -_validate_regex = re.compile( - r"^([A-Z0-9]|[A-Z0-9][A-Z0-9._-]*[A-Z0-9])$", re.IGNORECASE -) -_canonicalize_regex = re.compile(r"[-_.]+") -_normalized_regex = re.compile(r"^([a-z0-9]|[a-z0-9]([a-z0-9-](?!--))*[a-z0-9])$") -# PEP 427: The build number must start with a digit. -_build_tag_regex = re.compile(r"(\d+)(.*)") - - -def canonicalize_name(name: str, *, validate: bool = False) -> NormalizedName: - if validate and not _validate_regex.match(name): - raise InvalidName(f"name is invalid: {name!r}") - # This is taken from PEP 503. - value = _canonicalize_regex.sub("-", name).lower() - return cast(NormalizedName, value) - - -def is_normalized_name(name: str) -> bool: - return _normalized_regex.match(name) is not None - - -def canonicalize_version( - version: Union[Version, str], *, strip_trailing_zero: bool = True -) -> str: - """ - This is very similar to Version.__str__, but has one subtle difference - with the way it handles the release segment. - """ - if isinstance(version, str): - try: - parsed = Version(version) - except InvalidVersion: - # Legacy versions cannot be normalized - return version - else: - parsed = version - - parts = [] - - # Epoch - if parsed.epoch != 0: - parts.append(f"{parsed.epoch}!") - - # Release segment - release_segment = ".".join(str(x) for x in parsed.release) - if strip_trailing_zero: - # NB: This strips trailing '.0's to normalize - release_segment = re.sub(r"(\.0)+$", "", release_segment) - parts.append(release_segment) - - # Pre-release - if parsed.pre is not None: - parts.append("".join(str(x) for x in parsed.pre)) - - # Post-release - if parsed.post is not None: - parts.append(f".post{parsed.post}") - - # Development release - if parsed.dev is not None: - parts.append(f".dev{parsed.dev}") - - # Local version segment - if parsed.local is not None: - parts.append(f"+{parsed.local}") - - return "".join(parts) - - -def parse_wheel_filename( - filename: str, -) -> Tuple[NormalizedName, Version, BuildTag, FrozenSet[Tag]]: - if not filename.endswith(".whl"): - raise InvalidWheelFilename( - f"Invalid wheel filename (extension must be '.whl'): {filename}" - ) - - filename = filename[:-4] - dashes = filename.count("-") - if dashes not in (4, 5): - raise InvalidWheelFilename( - f"Invalid wheel filename (wrong number of parts): {filename}" - ) - - parts = filename.split("-", dashes - 2) - name_part = parts[0] - # See PEP 427 for the rules on escaping the project name. - if "__" in name_part or re.match(r"^[\w\d._]*$", name_part, re.UNICODE) is None: - raise InvalidWheelFilename(f"Invalid project name: {filename}") - name = canonicalize_name(name_part) - - try: - version = Version(parts[1]) - except InvalidVersion as e: - raise InvalidWheelFilename( - f"Invalid wheel filename (invalid version): {filename}" - ) from e - - if dashes == 5: - build_part = parts[2] - build_match = _build_tag_regex.match(build_part) - if build_match is None: - raise InvalidWheelFilename( - f"Invalid build number: {build_part} in '{filename}'" - ) - build = cast(BuildTag, (int(build_match.group(1)), build_match.group(2))) - else: - build = () - tags = parse_tag(parts[-1]) - return (name, version, build, tags) - - -def parse_sdist_filename(filename: str) -> Tuple[NormalizedName, Version]: - if filename.endswith(".tar.gz"): - file_stem = filename[: -len(".tar.gz")] - elif filename.endswith(".zip"): - file_stem = filename[: -len(".zip")] - else: - raise InvalidSdistFilename( - f"Invalid sdist filename (extension must be '.tar.gz' or '.zip'):" - f" {filename}" - ) - - # We are requiring a PEP 440 version, which cannot contain dashes, - # so we split on the last dash. - name_part, sep, version_part = file_stem.rpartition("-") - if not sep: - raise InvalidSdistFilename(f"Invalid sdist filename: {filename}") - - name = canonicalize_name(name_part) - - try: - version = Version(version_part) - except InvalidVersion as e: - raise InvalidSdistFilename( - f"Invalid sdist filename (invalid version): {filename}" - ) from e - - return (name, version) diff --git a/lib/packaging/version.py b/lib/packaging/version.py deleted file mode 100644 index 5faab9bd0..000000000 --- a/lib/packaging/version.py +++ /dev/null @@ -1,563 +0,0 @@ -# This file is dual licensed under the terms of the Apache License, Version -# 2.0, and the BSD License. See the LICENSE file in the root of this repository -# for complete details. -""" -.. testsetup:: - - from packaging.version import parse, Version -""" - -import itertools -import re -from typing import Any, Callable, NamedTuple, Optional, SupportsInt, Tuple, Union - -from ._structures import Infinity, InfinityType, NegativeInfinity, NegativeInfinityType - -__all__ = ["VERSION_PATTERN", "parse", "Version", "InvalidVersion"] - -LocalType = Tuple[Union[int, str], ...] - -CmpPrePostDevType = Union[InfinityType, NegativeInfinityType, Tuple[str, int]] -CmpLocalType = Union[ - NegativeInfinityType, - Tuple[Union[Tuple[int, str], Tuple[NegativeInfinityType, Union[int, str]]], ...], -] -CmpKey = Tuple[ - int, - Tuple[int, ...], - CmpPrePostDevType, - CmpPrePostDevType, - CmpPrePostDevType, - CmpLocalType, -] -VersionComparisonMethod = Callable[[CmpKey, CmpKey], bool] - - -class _Version(NamedTuple): - epoch: int - release: Tuple[int, ...] - dev: Optional[Tuple[str, int]] - pre: Optional[Tuple[str, int]] - post: Optional[Tuple[str, int]] - local: Optional[LocalType] - - -def parse(version: str) -> "Version": - """Parse the given version string. - - >>> parse('1.0.dev1') - - - :param version: The version string to parse. - :raises InvalidVersion: When the version string is not a valid version. - """ - return Version(version) - - -class InvalidVersion(ValueError): - """Raised when a version string is not a valid version. - - >>> Version("invalid") - Traceback (most recent call last): - ... - packaging.version.InvalidVersion: Invalid version: 'invalid' - """ - - -class _BaseVersion: - _key: Tuple[Any, ...] - - def __hash__(self) -> int: - return hash(self._key) - - # Please keep the duplicated `isinstance` check - # in the six comparisons hereunder - # unless you find a way to avoid adding overhead function calls. - def __lt__(self, other: "_BaseVersion") -> bool: - if not isinstance(other, _BaseVersion): - return NotImplemented - - return self._key < other._key - - def __le__(self, other: "_BaseVersion") -> bool: - if not isinstance(other, _BaseVersion): - return NotImplemented - - return self._key <= other._key - - def __eq__(self, other: object) -> bool: - if not isinstance(other, _BaseVersion): - return NotImplemented - - return self._key == other._key - - def __ge__(self, other: "_BaseVersion") -> bool: - if not isinstance(other, _BaseVersion): - return NotImplemented - - return self._key >= other._key - - def __gt__(self, other: "_BaseVersion") -> bool: - if not isinstance(other, _BaseVersion): - return NotImplemented - - return self._key > other._key - - def __ne__(self, other: object) -> bool: - if not isinstance(other, _BaseVersion): - return NotImplemented - - return self._key != other._key - - -# Deliberately not anchored to the start and end of the string, to make it -# easier for 3rd party code to reuse -_VERSION_PATTERN = r""" - v? - (?: - (?:(?P[0-9]+)!)? # epoch - (?P[0-9]+(?:\.[0-9]+)*) # release segment - (?P
                                          # pre-release
-            [-_\.]?
-            (?Palpha|a|beta|b|preview|pre|c|rc)
-            [-_\.]?
-            (?P[0-9]+)?
-        )?
-        (?P                                         # post release
-            (?:-(?P[0-9]+))
-            |
-            (?:
-                [-_\.]?
-                (?Ppost|rev|r)
-                [-_\.]?
-                (?P[0-9]+)?
-            )
-        )?
-        (?P                                          # dev release
-            [-_\.]?
-            (?Pdev)
-            [-_\.]?
-            (?P[0-9]+)?
-        )?
-    )
-    (?:\+(?P[a-z0-9]+(?:[-_\.][a-z0-9]+)*))?       # local version
-"""
-
-VERSION_PATTERN = _VERSION_PATTERN
-"""
-A string containing the regular expression used to match a valid version.
-
-The pattern is not anchored at either end, and is intended for embedding in larger
-expressions (for example, matching a version number as part of a file name). The
-regular expression should be compiled with the ``re.VERBOSE`` and ``re.IGNORECASE``
-flags set.
-
-:meta hide-value:
-"""
-
-
-class Version(_BaseVersion):
-    """This class abstracts handling of a project's versions.
-
-    A :class:`Version` instance is comparison aware and can be compared and
-    sorted using the standard Python interfaces.
-
-    >>> v1 = Version("1.0a5")
-    >>> v2 = Version("1.0")
-    >>> v1
-    
-    >>> v2
-    
-    >>> v1 < v2
-    True
-    >>> v1 == v2
-    False
-    >>> v1 > v2
-    False
-    >>> v1 >= v2
-    False
-    >>> v1 <= v2
-    True
-    """
-
-    _regex = re.compile(r"^\s*" + VERSION_PATTERN + r"\s*$", re.VERBOSE | re.IGNORECASE)
-    _key: CmpKey
-
-    def __init__(self, version: str) -> None:
-        """Initialize a Version object.
-
-        :param version:
-            The string representation of a version which will be parsed and normalized
-            before use.
-        :raises InvalidVersion:
-            If the ``version`` does not conform to PEP 440 in any way then this
-            exception will be raised.
-        """
-
-        # Validate the version and parse it into pieces
-        match = self._regex.search(version)
-        if not match:
-            raise InvalidVersion(f"Invalid version: '{version}'")
-
-        # Store the parsed out pieces of the version
-        self._version = _Version(
-            epoch=int(match.group("epoch")) if match.group("epoch") else 0,
-            release=tuple(int(i) for i in match.group("release").split(".")),
-            pre=_parse_letter_version(match.group("pre_l"), match.group("pre_n")),
-            post=_parse_letter_version(
-                match.group("post_l"), match.group("post_n1") or match.group("post_n2")
-            ),
-            dev=_parse_letter_version(match.group("dev_l"), match.group("dev_n")),
-            local=_parse_local_version(match.group("local")),
-        )
-
-        # Generate a key which will be used for sorting
-        self._key = _cmpkey(
-            self._version.epoch,
-            self._version.release,
-            self._version.pre,
-            self._version.post,
-            self._version.dev,
-            self._version.local,
-        )
-
-    def __repr__(self) -> str:
-        """A representation of the Version that shows all internal state.
-
-        >>> Version('1.0.0')
-        
-        """
-        return f""
-
-    def __str__(self) -> str:
-        """A string representation of the version that can be rounded-tripped.
-
-        >>> str(Version("1.0a5"))
-        '1.0a5'
-        """
-        parts = []
-
-        # Epoch
-        if self.epoch != 0:
-            parts.append(f"{self.epoch}!")
-
-        # Release segment
-        parts.append(".".join(str(x) for x in self.release))
-
-        # Pre-release
-        if self.pre is not None:
-            parts.append("".join(str(x) for x in self.pre))
-
-        # Post-release
-        if self.post is not None:
-            parts.append(f".post{self.post}")
-
-        # Development release
-        if self.dev is not None:
-            parts.append(f".dev{self.dev}")
-
-        # Local version segment
-        if self.local is not None:
-            parts.append(f"+{self.local}")
-
-        return "".join(parts)
-
-    @property
-    def epoch(self) -> int:
-        """The epoch of the version.
-
-        >>> Version("2.0.0").epoch
-        0
-        >>> Version("1!2.0.0").epoch
-        1
-        """
-        return self._version.epoch
-
-    @property
-    def release(self) -> Tuple[int, ...]:
-        """The components of the "release" segment of the version.
-
-        >>> Version("1.2.3").release
-        (1, 2, 3)
-        >>> Version("2.0.0").release
-        (2, 0, 0)
-        >>> Version("1!2.0.0.post0").release
-        (2, 0, 0)
-
-        Includes trailing zeroes but not the epoch or any pre-release / development /
-        post-release suffixes.
-        """
-        return self._version.release
-
-    @property
-    def pre(self) -> Optional[Tuple[str, int]]:
-        """The pre-release segment of the version.
-
-        >>> print(Version("1.2.3").pre)
-        None
-        >>> Version("1.2.3a1").pre
-        ('a', 1)
-        >>> Version("1.2.3b1").pre
-        ('b', 1)
-        >>> Version("1.2.3rc1").pre
-        ('rc', 1)
-        """
-        return self._version.pre
-
-    @property
-    def post(self) -> Optional[int]:
-        """The post-release number of the version.
-
-        >>> print(Version("1.2.3").post)
-        None
-        >>> Version("1.2.3.post1").post
-        1
-        """
-        return self._version.post[1] if self._version.post else None
-
-    @property
-    def dev(self) -> Optional[int]:
-        """The development number of the version.
-
-        >>> print(Version("1.2.3").dev)
-        None
-        >>> Version("1.2.3.dev1").dev
-        1
-        """
-        return self._version.dev[1] if self._version.dev else None
-
-    @property
-    def local(self) -> Optional[str]:
-        """The local version segment of the version.
-
-        >>> print(Version("1.2.3").local)
-        None
-        >>> Version("1.2.3+abc").local
-        'abc'
-        """
-        if self._version.local:
-            return ".".join(str(x) for x in self._version.local)
-        else:
-            return None
-
-    @property
-    def public(self) -> str:
-        """The public portion of the version.
-
-        >>> Version("1.2.3").public
-        '1.2.3'
-        >>> Version("1.2.3+abc").public
-        '1.2.3'
-        >>> Version("1.2.3+abc.dev1").public
-        '1.2.3'
-        """
-        return str(self).split("+", 1)[0]
-
-    @property
-    def base_version(self) -> str:
-        """The "base version" of the version.
-
-        >>> Version("1.2.3").base_version
-        '1.2.3'
-        >>> Version("1.2.3+abc").base_version
-        '1.2.3'
-        >>> Version("1!1.2.3+abc.dev1").base_version
-        '1!1.2.3'
-
-        The "base version" is the public version of the project without any pre or post
-        release markers.
-        """
-        parts = []
-
-        # Epoch
-        if self.epoch != 0:
-            parts.append(f"{self.epoch}!")
-
-        # Release segment
-        parts.append(".".join(str(x) for x in self.release))
-
-        return "".join(parts)
-
-    @property
-    def is_prerelease(self) -> bool:
-        """Whether this version is a pre-release.
-
-        >>> Version("1.2.3").is_prerelease
-        False
-        >>> Version("1.2.3a1").is_prerelease
-        True
-        >>> Version("1.2.3b1").is_prerelease
-        True
-        >>> Version("1.2.3rc1").is_prerelease
-        True
-        >>> Version("1.2.3dev1").is_prerelease
-        True
-        """
-        return self.dev is not None or self.pre is not None
-
-    @property
-    def is_postrelease(self) -> bool:
-        """Whether this version is a post-release.
-
-        >>> Version("1.2.3").is_postrelease
-        False
-        >>> Version("1.2.3.post1").is_postrelease
-        True
-        """
-        return self.post is not None
-
-    @property
-    def is_devrelease(self) -> bool:
-        """Whether this version is a development release.
-
-        >>> Version("1.2.3").is_devrelease
-        False
-        >>> Version("1.2.3.dev1").is_devrelease
-        True
-        """
-        return self.dev is not None
-
-    @property
-    def major(self) -> int:
-        """The first item of :attr:`release` or ``0`` if unavailable.
-
-        >>> Version("1.2.3").major
-        1
-        """
-        return self.release[0] if len(self.release) >= 1 else 0
-
-    @property
-    def minor(self) -> int:
-        """The second item of :attr:`release` or ``0`` if unavailable.
-
-        >>> Version("1.2.3").minor
-        2
-        >>> Version("1").minor
-        0
-        """
-        return self.release[1] if len(self.release) >= 2 else 0
-
-    @property
-    def micro(self) -> int:
-        """The third item of :attr:`release` or ``0`` if unavailable.
-
-        >>> Version("1.2.3").micro
-        3
-        >>> Version("1").micro
-        0
-        """
-        return self.release[2] if len(self.release) >= 3 else 0
-
-
-def _parse_letter_version(
-    letter: Optional[str], number: Union[str, bytes, SupportsInt, None]
-) -> Optional[Tuple[str, int]]:
-
-    if letter:
-        # We consider there to be an implicit 0 in a pre-release if there is
-        # not a numeral associated with it.
-        if number is None:
-            number = 0
-
-        # We normalize any letters to their lower case form
-        letter = letter.lower()
-
-        # We consider some words to be alternate spellings of other words and
-        # in those cases we want to normalize the spellings to our preferred
-        # spelling.
-        if letter == "alpha":
-            letter = "a"
-        elif letter == "beta":
-            letter = "b"
-        elif letter in ["c", "pre", "preview"]:
-            letter = "rc"
-        elif letter in ["rev", "r"]:
-            letter = "post"
-
-        return letter, int(number)
-    if not letter and number:
-        # We assume if we are given a number, but we are not given a letter
-        # then this is using the implicit post release syntax (e.g. 1.0-1)
-        letter = "post"
-
-        return letter, int(number)
-
-    return None
-
-
-_local_version_separators = re.compile(r"[\._-]")
-
-
-def _parse_local_version(local: Optional[str]) -> Optional[LocalType]:
-    """
-    Takes a string like abc.1.twelve and turns it into ("abc", 1, "twelve").
-    """
-    if local is not None:
-        return tuple(
-            part.lower() if not part.isdigit() else int(part)
-            for part in _local_version_separators.split(local)
-        )
-    return None
-
-
-def _cmpkey(
-    epoch: int,
-    release: Tuple[int, ...],
-    pre: Optional[Tuple[str, int]],
-    post: Optional[Tuple[str, int]],
-    dev: Optional[Tuple[str, int]],
-    local: Optional[LocalType],
-) -> CmpKey:
-
-    # When we compare a release version, we want to compare it with all of the
-    # trailing zeros removed. So we'll use a reverse the list, drop all the now
-    # leading zeros until we come to something non zero, then take the rest
-    # re-reverse it back into the correct order and make it a tuple and use
-    # that for our sorting key.
-    _release = tuple(
-        reversed(list(itertools.dropwhile(lambda x: x == 0, reversed(release))))
-    )
-
-    # We need to "trick" the sorting algorithm to put 1.0.dev0 before 1.0a0.
-    # We'll do this by abusing the pre segment, but we _only_ want to do this
-    # if there is not a pre or a post segment. If we have one of those then
-    # the normal sorting rules will handle this case correctly.
-    if pre is None and post is None and dev is not None:
-        _pre: CmpPrePostDevType = NegativeInfinity
-    # Versions without a pre-release (except as noted above) should sort after
-    # those with one.
-    elif pre is None:
-        _pre = Infinity
-    else:
-        _pre = pre
-
-    # Versions without a post segment should sort before those with one.
-    if post is None:
-        _post: CmpPrePostDevType = NegativeInfinity
-
-    else:
-        _post = post
-
-    # Versions without a development segment should sort after those with one.
-    if dev is None:
-        _dev: CmpPrePostDevType = Infinity
-
-    else:
-        _dev = dev
-
-    if local is None:
-        # Versions without a local segment should sort before those with one.
-        _local: CmpLocalType = NegativeInfinity
-    else:
-        # Versions with a local segment need that segment parsed to implement
-        # the sorting rules in PEP440.
-        # - Alpha numeric segments sort before numeric segments
-        # - Alpha numeric segments sort lexicographically
-        # - Numeric segments sort numerically
-        # - Shorter versions sort before longer versions when the prefixes
-        #   match exactly
-        _local = tuple(
-            (i, "") if isinstance(i, int) else (NegativeInfinity, i) for i in local
-        )
-
-    return epoch, _release, _pre, _post, _dev, _local
diff --git a/lib/pavilion/builder.py b/lib/pavilion/builder.py
index 7a13a1e58..88cb3f317 100644
--- a/lib/pavilion/builder.py
+++ b/lib/pavilion/builder.py
@@ -484,7 +484,7 @@ def build(self, test_id: str, tracker: BuildTracker,
 
             # Only use NFS Lock if building on nodes
             if self._pav_cfg.get('build', {}).get('on_nodes', 'false').lower() == 'true':
-                locks.append(Lock(self.path.parent / f"{self.name}.lock", lifetime=3))
+                locks.append(Lock(str(self.path.parent / f"{self.name}.lock"), lifetime=3))
 
             # Allows for variable number of locks
             with ExitStack() as stack:
diff --git a/lib/pavilion/clean.py b/lib/pavilion/clean.py
index 8fa67c7a7..da6a0dbe8 100644
--- a/lib/pavilion/clean.py
+++ b/lib/pavilion/clean.py
@@ -10,7 +10,7 @@
 from pavilion.test_run import TestAttributes
 from pavilion.timing import RateLimiter
 
-from flufl.lock import Lock
+from flufl.lock import Lock, TimeOutError
 
 
 def delete_tests(pav_cfg, id_dir: Path, filter_func, verbose: bool = False):
@@ -58,21 +58,26 @@ def delete_unused_builds(pav_cfg, builds_dir: Path, tests_dir: Path, verbose: bo
 
     lock_path = builds_dir.with_suffix('.lock')
     msgs = []
-    with Lock(lock_path, lifetime=3) as lock:
-        refresh_limiter = RateLimiter(lock.refresh, cooldown=0.3)
-
-        for path in dir_db.select(pav_cfg, builds_dir, filter_builds)[0]:
-            refresh_limiter()
-            try:
-                shutil.rmtree(path.as_posix())
-                path.with_suffix(TestBuilder.FINISHED_SUFFIX).unlink()
-            except OSError as err:
-                msgs.append("Could not remove build {}: {}"
-                            .format(path, err))
-                continue
-            count += 1
-            if verbose:
-                msgs.append('Removed build {}.'.format(path.name))
+
+    try:
+        with Lock(str(lock_path), lifetime=3) as lock:
+            refresh_limiter = RateLimiter(lock.refresh, cooldown=0.3)
+
+            for path in dir_db.select(pav_cfg, builds_dir, filter_builds)[0]:
+                refresh_limiter()
+                try:
+                    shutil.rmtree(path.as_posix())
+                    path.with_suffix(TestBuilder.FINISHED_SUFFIX).unlink()
+                except OSError as err:
+                    msgs.append("Could not remove build {}: {}"
+                                .format(path, err))
+                    continue
+                count += 1
+                if verbose:
+                    msgs.append('Removed build {}.'.format(path.name))
+    except TimeOutError:
+        # Convert flufl.lock.TimeOutError into native Python TimeoutError
+        raise TimeoutError
 
     return count, msgs
 
diff --git a/lib/pavilion/counter.py b/lib/pavilion/counter.py
index f65321ce8..ae8ff8e6d 100644
--- a/lib/pavilion/counter.py
+++ b/lib/pavilion/counter.py
@@ -3,7 +3,7 @@
 from pathlib import Path
 from typing import Iterator
 
-from flufl.lock import Lock
+from flufl.lock import Lock, TimeOutError
 
 from pavilion.test_ids import SeriesID, TestID
 
@@ -22,7 +22,7 @@ def __init__(self, series_dir: Path, next_id_fn: str = "next_id",
 
         self._path = self._dir / next_id_fn
         self._start = start_id
-        self._lockfile = Lock(self._dir / self.LOCKFILE_FN, lifetime=3)
+        self._lockfile = Lock(str(self._dir / self.LOCKFILE_FN), lifetime=3)
 
         self._setup()
 
@@ -31,9 +31,13 @@ def _setup(self) -> None:
         correct starting value. If an existing next ID file is found, the current value
         is retained."""
 
-        with self._lockfile:
-            if not self._path.exists():
-                self._path.write_text(f"{self._start.as_int()}\n", encoding="utf-8")
+        try:
+            with self._lockfile:
+                if not self._path.exists():
+                    self._path.write_text(f"{self._start.as_int()}\n", encoding="utf-8")
+        except TimeOutError:
+            # Convert flufl.lock.TimeOutError into native Python TimeoutError
+            raise TimeoutError
 
     def __iter__(self) -> "SeriesIDCounter":
         return self
@@ -42,26 +46,34 @@ def __next__(self) -> SeriesID:
         """Return the next SeriesID and advance the counter, skipping IDs that already
         have a series directory."""
 
-        with self._lockfile:
-            try:
-                id_int = int(self._path.read_text(encoding="utf-8").strip())
-            except (OSError, ValueError) as err:
-                raise ValueError(f"Unable to read next value from {self._path}: {err}")
+        try:
+            with self._lockfile:
+                try:
+                    id_int = int(self._path.read_text(encoding="utf-8").strip())
+                except (OSError, ValueError) as err:
+                    raise ValueError(f"Unable to read next value from {self._path}: {err}")
 
-            current_id = SeriesID.from_int(id_int)
+                current_id = SeriesID.from_int(id_int)
 
-            while (self._dir / str(current_id.as_int())).exists():
-                current_id = current_id.next()
+                while (self._dir / str(current_id.as_int())).exists():
+                    current_id = current_id.next()
 
-            self._path.write_text(f"{current_id.next().as_int()}\n", encoding="utf-8")
+                self._path.write_text(f"{current_id.next().as_int()}\n", encoding="utf-8")
+        except TimeOutError:
+            # Convert flufl.lock.TimeOutError into native Python TimeoutError
+            raise TimeoutError
 
         return current_id
 
     def reset(self) -> None:
         """Reset the counter to the start value."""
 
-        with self._lockfile:
-            self._path.write_text(f"{self._start.as_int()}\n", encoding="utf-8")
+        try:
+            with self._lockfile:
+                self._path.write_text(f"{self._start.as_int()}\n", encoding="utf-8")
+        except TimeOutError:
+            # Convert flufl.lock.TimeOutError into native Python TimeoutError
+            raise TimeoutError
 
 
 class TestIDCounter(Iterator[TestID]):
diff --git a/lib/pavilion/dir_db.py b/lib/pavilion/dir_db.py
index 3026ce141..c06b4ea99 100644
--- a/lib/pavilion/dir_db.py
+++ b/lib/pavilion/dir_db.py
@@ -19,7 +19,7 @@
 from pavilion import output
 from pavilion.test_ids import TestID
 
-from flufl.lock import Lock
+from flufl.lock import Lock, TimeOutError
 
 
 ID_DIGITS = 7
@@ -41,12 +41,12 @@ def reset_pkey(id_dir: Path) -> None:
     the pkey file ('next_id') if present."""
 
     try:
-        with Lock(id_dir/'.lockfile', default_timeout=1, lifetime=3):
+        with Lock(str(id_dir/'.lockfile'), default_timeout=1, lifetime=3):
             try:
                 (id_dir/PKEY_FN).unlink()
             except OSError:
                 pass
-    except TimeoutError:
+    except TimeOutError:
         pass
 
 def default_filter(_: Path) -> bool:
@@ -392,7 +392,7 @@ def delete(pav_cfg, id_dir: Path, filter_func: Callable[[Path], bool] = default_
 
     lock_path = id_dir.with_suffix('.lock')
     try:
-        with Lock(lock_path, default_timeout=1, lifetime=3):
+        with Lock(str(lock_path), default_timeout=1, lifetime=3):
             for path in select(pav_cfg, id_dir=id_dir, filter_func=filter_func,
                                transform=transform).paths:
                 try:
@@ -404,7 +404,7 @@ def delete(pav_cfg, id_dir: Path, filter_func: Callable[[Path], bool] = default_
                 count += 1
                 if verbose:
                     msgs.append("Removed {} {}.".format(id_dir.name, path.name))
-    except TimeoutError:
+    except TimeOutError:
         msgs.append("Could not delete in dir '{}', lock '{}' could not be acquired"
                     .format(id_dir, lock_path))
 
diff --git a/lib/pavilion/log_setup.py b/lib/pavilion/log_setup.py
index 1ee6f6475..b7cef491c 100644
--- a/lib/pavilion/log_setup.py
+++ b/lib/pavilion/log_setup.py
@@ -8,7 +8,7 @@
 from pathlib import Path
 from typing import TextIO
 
-from flufl.lock import Lock
+from flufl.lock import Lock, TimeOutError
 
 
 class LockFileRotatingFileHandler(logging.Handler):
@@ -44,7 +44,7 @@ def __init__(self, file_name, max_bytes=0, backup_count=0,
         self.encoding = encoding
         self.lock_timeout = lock_timeout
         lockfile_path = self.file_name.parent/(self.file_name.name + '.lock')
-        self.lock_file = Lock(lockfile_path,
+        self.lock_file = Lock(str(lockfile_path),
                                   default_timeout=self.lock_timeout, lifetime=3)
 
         super().__init__()
@@ -77,7 +77,7 @@ def emit(self, record):
                     file.write(msg)
                     file.write(self.TERMINATOR)
 
-        except (OSError, IOError, TimeoutError):
+        except (OSError, IOError, TimeOutError):
             self.handleError(record)
 
     def handleError(self, record: logging.LogRecord) -> None:
diff --git a/lib/pavilion/result/__init__.py b/lib/pavilion/result/__init__.py
index 285b8d655..b4715f57b 100644
--- a/lib/pavilion/result/__init__.py
+++ b/lib/pavilion/result/__init__.py
@@ -17,7 +17,7 @@
 from ..errors import StringParserError, ResultError
 from .parse import parse_results, DEFAULT_KEY
 
-from flufl.lock import Lock
+from flufl.lock import Lock, TimeOutError
 
 def check_config(parser_conf, evaluate_conf):
     """Make sure the result config is sensible, both for result parsers and
@@ -118,33 +118,36 @@ def prune_result_log(log_path: Path, ids: List[str]) -> List[dict]:
     rewrite_log_path = log_path.with_suffix('.rewrite')
     lockfile_path = log_path.with_suffix(log_path.suffix + '.lock')
 
-    with Lock(lockfile_path, lifetime=3) as lock, \
-         log_path.open() as result_log, \
-            rewrite_log_path.open('w') as rewrite_log:
+    try:
+        with Lock(str(lockfile_path), lifetime=3) as lock, \
+            log_path.open() as result_log, \
+                rewrite_log_path.open('w') as rewrite_log:
 
-        refresh_limiter = RateLimiter(lock.refresh, cooldown=0.3)
+            refresh_limiter = RateLimiter(lock.refresh, cooldown=0.3)
 
-        for line in result_log:
-            refresh_limiter()
-            try:
-                result = json.loads(line)
-            except json.JSONDecodeError:
-                # If we can't parse the line, just rewrite it as is.
-                rewrite_log.write(line)
-                continue
+            for line in result_log:
+                refresh_limiter()
+                try:
+                    result = json.loads(line)
+                except json.JSONDecodeError:
+                    # If we can't parse the line, just rewrite it as is.
+                    rewrite_log.write(line)
+                    continue
 
-            if not (str(result.get('id')) in ids
-                    or result.get('uuid') in ids):
-                rewrite_log.write(line)
-            else:
-                pruned.append(result)
+                if not (str(result.get('id')) in ids
+                        or result.get('uuid') in ids):
+                    rewrite_log.write(line)
+                else:
+                    pruned.append(result)
 
-        log_path.unlink()
-        rewrite_log_path.rename(log_path)
+            log_path.unlink()
+            rewrite_log_path.rename(log_path)
+    except TimeOutError:
+        # Convert flufl.lock.TimeOutError into native Python TimeoutError
+        raise TimeoutError
 
     return pruned
 
-
 def remove_temp_results(results: dict, log: utils.IndentedLog) -> None:
     """Remove all result keys that start with an underscore."""
 
diff --git a/lib/pavilion/result_logging/common_file_logger.py b/lib/pavilion/result_logging/common_file_logger.py
index 2c817b19e..f63c6d351 100644
--- a/lib/pavilion/result_logging/common_file_logger.py
+++ b/lib/pavilion/result_logging/common_file_logger.py
@@ -7,7 +7,7 @@
 from pavilion.errors import ResultLoggerPluginError
 from .base_classes import ResultLoggerPlugin, ResultLogger
 
-from flufl.lock import Lock
+from flufl.lock import Lock, TimeOutError
 
 
 class CommonFileLoggerFactory(ResultLoggerPlugin):
@@ -59,7 +59,11 @@ def __init__(self, dest: Path, outfile: Optional[TextIO] = None):
     def log(self, results: Dict) -> None:
         output.fprint(self.outfile, f"{type(self).__name__}: Logging {results} to {self.dest}...")
 
-        with Lock(self.dest.parent / "results.lock", default_timeout=10, lifetime=3):
-            with open(self.dest, "a") as fout:
-                json.dump(results, fout)
-                fout.write("\n")
+        try:
+            with Lock(str(self.dest.parent / "results.lock"), default_timeout=10, lifetime=3):
+                with open(self.dest, "a") as fout:
+                    json.dump(results, fout)
+                    fout.write("\n")
+        except TimeOutError:
+            # Convert flufl.lock.TimeOutError into native Python TimeoutError
+            raise TimeoutError
diff --git a/lib/pavilion/series/series.py b/lib/pavilion/series/series.py
index 3b7d9f0c7..e34815342 100644
--- a/lib/pavilion/series/series.py
+++ b/lib/pavilion/series/series.py
@@ -40,7 +40,7 @@
 from ..errors import TestSetError, TestSeriesError, TestSeriesWarning, ResultLoggerPluginError
 from . import common
 
-from flufl.lock import Lock
+from flufl.lock import Lock, TimeOutError
 
 
 class TestSeries:
@@ -830,24 +830,28 @@ def _save_series_id(self):
 
         lockfile_path = json_file.with_suffix('.lock')
 
-        with Lock(lockfile_path, lifetime=3):
-            data = {}
-            try:
-                with json_file.open() as json_series_file:
-                    try:
-                        data = json.load(json_series_file)
-                    except json.decoder.JSONDecodeError:
-                        # File was empty, therefore json couldn't be loaded.
-                        pass
-                with json_file.open('w') as json_series_file:
-                    data[sys_name] = str(self.id)
-                    json_series_file.write(json.dumps(data))
-
-            except FileNotFoundError:
-                # File hadn't been created yet.
-                with json_file.open('w') as json_series_file:
-                    data[sys_name] = str(self.id)
-                    json_series_file.write(json.dumps(data))
+        try:
+            with Lock(str(lockfile_path), lifetime=3):
+                data = {}
+                try:
+                    with json_file.open() as json_series_file:
+                        try:
+                            data = json.load(json_series_file)
+                        except json.decoder.JSONDecodeError:
+                            # File was empty, therefore json couldn't be loaded.
+                            pass
+                    with json_file.open('w') as json_series_file:
+                        data[sys_name] = str(self.id)
+                        json_series_file.write(json.dumps(data))
+
+                except FileNotFoundError:
+                    # File hadn't been created yet.
+                    with json_file.open('w') as json_series_file:
+                        data[sys_name] = str(self.id)
+                        json_series_file.write(json.dumps(data))
+        except TimeOutError:
+            # Convert flufl.lock.TimeOutError into native Python TimeoutError
+            raise TimeoutError
 
     def get_result_paths(self) -> List[Path]:
         """Get all results log paths."""
diff --git a/lib/requests b/lib/requests
deleted file mode 120000
index ec6242d9b..000000000
--- a/lib/requests
+++ /dev/null
@@ -1 +0,0 @@
-sub_repos/requests/requests/
\ No newline at end of file
diff --git a/lib/sub_repos/chardet/LICENSE b/lib/sub_repos/chardet/LICENSE
deleted file mode 100644
index 8add30ad5..000000000
--- a/lib/sub_repos/chardet/LICENSE
+++ /dev/null
@@ -1,504 +0,0 @@
-		  GNU LESSER GENERAL PUBLIC LICENSE
-		       Version 2.1, February 1999
-
- Copyright (C) 1991, 1999 Free Software Foundation, Inc.
-     51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
- Everyone is permitted to copy and distribute verbatim copies
- of this license document, but changing it is not allowed.
-
-[This is the first released version of the Lesser GPL.  It also counts
- as the successor of the GNU Library Public License, version 2, hence
- the version number 2.1.]
-
-			    Preamble
-
-  The licenses for most software are designed to take away your
-freedom to share and change it.  By contrast, the GNU General Public
-Licenses are intended to guarantee your freedom to share and change
-free software--to make sure the software is free for all its users.
-
-  This license, the Lesser General Public License, applies to some
-specially designated software packages--typically libraries--of the
-Free Software Foundation and other authors who decide to use it.  You
-can use it too, but we suggest you first think carefully about whether
-this license or the ordinary General Public License is the better
-strategy to use in any particular case, based on the explanations below.
-
-  When we speak of free software, we are referring to freedom of use,
-not price.  Our General Public Licenses are designed to make sure that
-you have the freedom to distribute copies of free software (and charge
-for this service if you wish); that you receive source code or can get
-it if you want it; that you can change the software and use pieces of
-it in new free programs; and that you are informed that you can do
-these things.
-
-  To protect your rights, we need to make restrictions that forbid
-distributors to deny you these rights or to ask you to surrender these
-rights.  These restrictions translate to certain responsibilities for
-you if you distribute copies of the library or if you modify it.
-
-  For example, if you distribute copies of the library, whether gratis
-or for a fee, you must give the recipients all the rights that we gave
-you.  You must make sure that they, too, receive or can get the source
-code.  If you link other code with the library, you must provide
-complete object files to the recipients, so that they can relink them
-with the library after making changes to the library and recompiling
-it.  And you must show them these terms so they know their rights.
-
-  We protect your rights with a two-step method: (1) we copyright the
-library, and (2) we offer you this license, which gives you legal
-permission to copy, distribute and/or modify the library.
-
-  To protect each distributor, we want to make it very clear that
-there is no warranty for the free library.  Also, if the library is
-modified by someone else and passed on, the recipients should know
-that what they have is not the original version, so that the original
-author's reputation will not be affected by problems that might be
-introduced by others.
-
-  Finally, software patents pose a constant threat to the existence of
-any free program.  We wish to make sure that a company cannot
-effectively restrict the users of a free program by obtaining a
-restrictive license from a patent holder.  Therefore, we insist that
-any patent license obtained for a version of the library must be
-consistent with the full freedom of use specified in this license.
-
-  Most GNU software, including some libraries, is covered by the
-ordinary GNU General Public License.  This license, the GNU Lesser
-General Public License, applies to certain designated libraries, and
-is quite different from the ordinary General Public License.  We use
-this license for certain libraries in order to permit linking those
-libraries into non-free programs.
-
-  When a program is linked with a library, whether statically or using
-a shared library, the combination of the two is legally speaking a
-combined work, a derivative of the original library.  The ordinary
-General Public License therefore permits such linking only if the
-entire combination fits its criteria of freedom.  The Lesser General
-Public License permits more lax criteria for linking other code with
-the library.
-
-  We call this license the "Lesser" General Public License because it
-does Less to protect the user's freedom than the ordinary General
-Public License.  It also provides other free software developers Less
-of an advantage over competing non-free programs.  These disadvantages
-are the reason we use the ordinary General Public License for many
-libraries.  However, the Lesser license provides advantages in certain
-special circumstances.
-
-  For example, on rare occasions, there may be a special need to
-encourage the widest possible use of a certain library, so that it becomes
-a de-facto standard.  To achieve this, non-free programs must be
-allowed to use the library.  A more frequent case is that a free
-library does the same job as widely used non-free libraries.  In this
-case, there is little to gain by limiting the free library to free
-software only, so we use the Lesser General Public License.
-
-  In other cases, permission to use a particular library in non-free
-programs enables a greater number of people to use a large body of
-free software.  For example, permission to use the GNU C Library in
-non-free programs enables many more people to use the whole GNU
-operating system, as well as its variant, the GNU/Linux operating
-system.
-
-  Although the Lesser General Public License is Less protective of the
-users' freedom, it does ensure that the user of a program that is
-linked with the Library has the freedom and the wherewithal to run
-that program using a modified version of the Library.
-
-  The precise terms and conditions for copying, distribution and
-modification follow.  Pay close attention to the difference between a
-"work based on the library" and a "work that uses the library".  The
-former contains code derived from the library, whereas the latter must
-be combined with the library in order to run.
-
-		  GNU LESSER GENERAL PUBLIC LICENSE
-   TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
-
-  0. This License Agreement applies to any software library or other
-program which contains a notice placed by the copyright holder or
-other authorized party saying it may be distributed under the terms of
-this Lesser General Public License (also called "this License").
-Each licensee is addressed as "you".
-
-  A "library" means a collection of software functions and/or data
-prepared so as to be conveniently linked with application programs
-(which use some of those functions and data) to form executables.
-
-  The "Library", below, refers to any such software library or work
-which has been distributed under these terms.  A "work based on the
-Library" means either the Library or any derivative work under
-copyright law: that is to say, a work containing the Library or a
-portion of it, either verbatim or with modifications and/or translated
-straightforwardly into another language.  (Hereinafter, translation is
-included without limitation in the term "modification".)
-
-  "Source code" for a work means the preferred form of the work for
-making modifications to it.  For a library, complete source code means
-all the source code for all modules it contains, plus any associated
-interface definition files, plus the scripts used to control compilation
-and installation of the library.
-
-  Activities other than copying, distribution and modification are not
-covered by this License; they are outside its scope.  The act of
-running a program using the Library is not restricted, and output from
-such a program is covered only if its contents constitute a work based
-on the Library (independent of the use of the Library in a tool for
-writing it).  Whether that is true depends on what the Library does
-and what the program that uses the Library does.
-  
-  1. You may copy and distribute verbatim copies of the Library's
-complete source code as you receive it, in any medium, provided that
-you conspicuously and appropriately publish on each copy an
-appropriate copyright notice and disclaimer of warranty; keep intact
-all the notices that refer to this License and to the absence of any
-warranty; and distribute a copy of this License along with the
-Library.
-
-  You may charge a fee for the physical act of transferring a copy,
-and you may at your option offer warranty protection in exchange for a
-fee.
-
-  2. You may modify your copy or copies of the Library or any portion
-of it, thus forming a work based on the Library, and copy and
-distribute such modifications or work under the terms of Section 1
-above, provided that you also meet all of these conditions:
-
-    a) The modified work must itself be a software library.
-
-    b) You must cause the files modified to carry prominent notices
-    stating that you changed the files and the date of any change.
-
-    c) You must cause the whole of the work to be licensed at no
-    charge to all third parties under the terms of this License.
-
-    d) If a facility in the modified Library refers to a function or a
-    table of data to be supplied by an application program that uses
-    the facility, other than as an argument passed when the facility
-    is invoked, then you must make a good faith effort to ensure that,
-    in the event an application does not supply such function or
-    table, the facility still operates, and performs whatever part of
-    its purpose remains meaningful.
-
-    (For example, a function in a library to compute square roots has
-    a purpose that is entirely well-defined independent of the
-    application.  Therefore, Subsection 2d requires that any
-    application-supplied function or table used by this function must
-    be optional: if the application does not supply it, the square
-    root function must still compute square roots.)
-
-These requirements apply to the modified work as a whole.  If
-identifiable sections of that work are not derived from the Library,
-and can be reasonably considered independent and separate works in
-themselves, then this License, and its terms, do not apply to those
-sections when you distribute them as separate works.  But when you
-distribute the same sections as part of a whole which is a work based
-on the Library, the distribution of the whole must be on the terms of
-this License, whose permissions for other licensees extend to the
-entire whole, and thus to each and every part regardless of who wrote
-it.
-
-Thus, it is not the intent of this section to claim rights or contest
-your rights to work written entirely by you; rather, the intent is to
-exercise the right to control the distribution of derivative or
-collective works based on the Library.
-
-In addition, mere aggregation of another work not based on the Library
-with the Library (or with a work based on the Library) on a volume of
-a storage or distribution medium does not bring the other work under
-the scope of this License.
-
-  3. You may opt to apply the terms of the ordinary GNU General Public
-License instead of this License to a given copy of the Library.  To do
-this, you must alter all the notices that refer to this License, so
-that they refer to the ordinary GNU General Public License, version 2,
-instead of to this License.  (If a newer version than version 2 of the
-ordinary GNU General Public License has appeared, then you can specify
-that version instead if you wish.)  Do not make any other change in
-these notices.
-
-  Once this change is made in a given copy, it is irreversible for
-that copy, so the ordinary GNU General Public License applies to all
-subsequent copies and derivative works made from that copy.
-
-  This option is useful when you wish to copy part of the code of
-the Library into a program that is not a library.
-
-  4. You may copy and distribute the Library (or a portion or
-derivative of it, under Section 2) in object code or executable form
-under the terms of Sections 1 and 2 above provided that you accompany
-it with the complete corresponding machine-readable source code, which
-must be distributed under the terms of Sections 1 and 2 above on a
-medium customarily used for software interchange.
-
-  If distribution of object code is made by offering access to copy
-from a designated place, then offering equivalent access to copy the
-source code from the same place satisfies the requirement to
-distribute the source code, even though third parties are not
-compelled to copy the source along with the object code.
-
-  5. A program that contains no derivative of any portion of the
-Library, but is designed to work with the Library by being compiled or
-linked with it, is called a "work that uses the Library".  Such a
-work, in isolation, is not a derivative work of the Library, and
-therefore falls outside the scope of this License.
-
-  However, linking a "work that uses the Library" with the Library
-creates an executable that is a derivative of the Library (because it
-contains portions of the Library), rather than a "work that uses the
-library".  The executable is therefore covered by this License.
-Section 6 states terms for distribution of such executables.
-
-  When a "work that uses the Library" uses material from a header file
-that is part of the Library, the object code for the work may be a
-derivative work of the Library even though the source code is not.
-Whether this is true is especially significant if the work can be
-linked without the Library, or if the work is itself a library.  The
-threshold for this to be true is not precisely defined by law.
-
-  If such an object file uses only numerical parameters, data
-structure layouts and accessors, and small macros and small inline
-functions (ten lines or less in length), then the use of the object
-file is unrestricted, regardless of whether it is legally a derivative
-work.  (Executables containing this object code plus portions of the
-Library will still fall under Section 6.)
-
-  Otherwise, if the work is a derivative of the Library, you may
-distribute the object code for the work under the terms of Section 6.
-Any executables containing that work also fall under Section 6,
-whether or not they are linked directly with the Library itself.
-
-  6. As an exception to the Sections above, you may also combine or
-link a "work that uses the Library" with the Library to produce a
-work containing portions of the Library, and distribute that work
-under terms of your choice, provided that the terms permit
-modification of the work for the customer's own use and reverse
-engineering for debugging such modifications.
-
-  You must give prominent notice with each copy of the work that the
-Library is used in it and that the Library and its use are covered by
-this License.  You must supply a copy of this License.  If the work
-during execution displays copyright notices, you must include the
-copyright notice for the Library among them, as well as a reference
-directing the user to the copy of this License.  Also, you must do one
-of these things:
-
-    a) Accompany the work with the complete corresponding
-    machine-readable source code for the Library including whatever
-    changes were used in the work (which must be distributed under
-    Sections 1 and 2 above); and, if the work is an executable linked
-    with the Library, with the complete machine-readable "work that
-    uses the Library", as object code and/or source code, so that the
-    user can modify the Library and then relink to produce a modified
-    executable containing the modified Library.  (It is understood
-    that the user who changes the contents of definitions files in the
-    Library will not necessarily be able to recompile the application
-    to use the modified definitions.)
-
-    b) Use a suitable shared library mechanism for linking with the
-    Library.  A suitable mechanism is one that (1) uses at run time a
-    copy of the library already present on the user's computer system,
-    rather than copying library functions into the executable, and (2)
-    will operate properly with a modified version of the library, if
-    the user installs one, as long as the modified version is
-    interface-compatible with the version that the work was made with.
-
-    c) Accompany the work with a written offer, valid for at
-    least three years, to give the same user the materials
-    specified in Subsection 6a, above, for a charge no more
-    than the cost of performing this distribution.
-
-    d) If distribution of the work is made by offering access to copy
-    from a designated place, offer equivalent access to copy the above
-    specified materials from the same place.
-
-    e) Verify that the user has already received a copy of these
-    materials or that you have already sent this user a copy.
-
-  For an executable, the required form of the "work that uses the
-Library" must include any data and utility programs needed for
-reproducing the executable from it.  However, as a special exception,
-the materials to be distributed need not include anything that is
-normally distributed (in either source or binary form) with the major
-components (compiler, kernel, and so on) of the operating system on
-which the executable runs, unless that component itself accompanies
-the executable.
-
-  It may happen that this requirement contradicts the license
-restrictions of other proprietary libraries that do not normally
-accompany the operating system.  Such a contradiction means you cannot
-use both them and the Library together in an executable that you
-distribute.
-
-  7. You may place library facilities that are a work based on the
-Library side-by-side in a single library together with other library
-facilities not covered by this License, and distribute such a combined
-library, provided that the separate distribution of the work based on
-the Library and of the other library facilities is otherwise
-permitted, and provided that you do these two things:
-
-    a) Accompany the combined library with a copy of the same work
-    based on the Library, uncombined with any other library
-    facilities.  This must be distributed under the terms of the
-    Sections above.
-
-    b) Give prominent notice with the combined library of the fact
-    that part of it is a work based on the Library, and explaining
-    where to find the accompanying uncombined form of the same work.
-
-  8. You may not copy, modify, sublicense, link with, or distribute
-the Library except as expressly provided under this License.  Any
-attempt otherwise to copy, modify, sublicense, link with, or
-distribute the Library is void, and will automatically terminate your
-rights under this License.  However, parties who have received copies,
-or rights, from you under this License will not have their licenses
-terminated so long as such parties remain in full compliance.
-
-  9. You are not required to accept this License, since you have not
-signed it.  However, nothing else grants you permission to modify or
-distribute the Library or its derivative works.  These actions are
-prohibited by law if you do not accept this License.  Therefore, by
-modifying or distributing the Library (or any work based on the
-Library), you indicate your acceptance of this License to do so, and
-all its terms and conditions for copying, distributing or modifying
-the Library or works based on it.
-
-  10. Each time you redistribute the Library (or any work based on the
-Library), the recipient automatically receives a license from the
-original licensor to copy, distribute, link with or modify the Library
-subject to these terms and conditions.  You may not impose any further
-restrictions on the recipients' exercise of the rights granted herein.
-You are not responsible for enforcing compliance by third parties with
-this License.
-
-  11. If, as a consequence of a court judgment or allegation of patent
-infringement or for any other reason (not limited to patent issues),
-conditions are imposed on you (whether by court order, agreement or
-otherwise) that contradict the conditions of this License, they do not
-excuse you from the conditions of this License.  If you cannot
-distribute so as to satisfy simultaneously your obligations under this
-License and any other pertinent obligations, then as a consequence you
-may not distribute the Library at all.  For example, if a patent
-license would not permit royalty-free redistribution of the Library by
-all those who receive copies directly or indirectly through you, then
-the only way you could satisfy both it and this License would be to
-refrain entirely from distribution of the Library.
-
-If any portion of this section is held invalid or unenforceable under any
-particular circumstance, the balance of the section is intended to apply,
-and the section as a whole is intended to apply in other circumstances.
-
-It is not the purpose of this section to induce you to infringe any
-patents or other property right claims or to contest validity of any
-such claims; this section has the sole purpose of protecting the
-integrity of the free software distribution system which is
-implemented by public license practices.  Many people have made
-generous contributions to the wide range of software distributed
-through that system in reliance on consistent application of that
-system; it is up to the author/donor to decide if he or she is willing
-to distribute software through any other system and a licensee cannot
-impose that choice.
-
-This section is intended to make thoroughly clear what is believed to
-be a consequence of the rest of this License.
-
-  12. If the distribution and/or use of the Library is restricted in
-certain countries either by patents or by copyrighted interfaces, the
-original copyright holder who places the Library under this License may add
-an explicit geographical distribution limitation excluding those countries,
-so that distribution is permitted only in or among countries not thus
-excluded.  In such case, this License incorporates the limitation as if
-written in the body of this License.
-
-  13. The Free Software Foundation may publish revised and/or new
-versions of the Lesser General Public License from time to time.
-Such new versions will be similar in spirit to the present version,
-but may differ in detail to address new problems or concerns.
-
-Each version is given a distinguishing version number.  If the Library
-specifies a version number of this License which applies to it and
-"any later version", you have the option of following the terms and
-conditions either of that version or of any later version published by
-the Free Software Foundation.  If the Library does not specify a
-license version number, you may choose any version ever published by
-the Free Software Foundation.
-
-  14. If you wish to incorporate parts of the Library into other free
-programs whose distribution conditions are incompatible with these,
-write to the author to ask for permission.  For software which is
-copyrighted by the Free Software Foundation, write to the Free
-Software Foundation; we sometimes make exceptions for this.  Our
-decision will be guided by the two goals of preserving the free status
-of all derivatives of our free software and of promoting the sharing
-and reuse of software generally.
-
-			    NO WARRANTY
-
-  15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO
-WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW.
-EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR
-OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY
-KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE
-IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
-PURPOSE.  THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE
-LIBRARY IS WITH YOU.  SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME
-THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
-
-  16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN
-WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY
-AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU
-FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR
-CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE
-LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING
-RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A
-FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF
-SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
-DAMAGES.
-
-		     END OF TERMS AND CONDITIONS
-
-           How to Apply These Terms to Your New Libraries
-
-  If you develop a new library, and you want it to be of the greatest
-possible use to the public, we recommend making it free software that
-everyone can redistribute and change.  You can do so by permitting
-redistribution under these terms (or, alternatively, under the terms of the
-ordinary General Public License).
-
-  To apply these terms, attach the following notices to the library.  It is
-safest to attach them to the start of each source file to most effectively
-convey the exclusion of warranty; and each file should have at least the
-"copyright" line and a pointer to where the full notice is found.
-
-    
-    Copyright (C)   
-
-    This library is free software; you can redistribute it and/or
-    modify it under the terms of the GNU Lesser General Public
-    License as published by the Free Software Foundation; either
-    version 2.1 of the License, or (at your option) any later version.
-
-    This library is distributed in the hope that it will be useful,
-    but WITHOUT ANY WARRANTY; without even the implied warranty of
-    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-    Lesser General Public License for more details.
-
-    You should have received a copy of the GNU Lesser General Public
-    License along with this library; if not, write to the Free Software
-    Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
-
-Also add information on how to contact you by electronic and paper mail.
-
-You should also get your employer (if you work as a programmer) or your
-school, if any, to sign a "copyright disclaimer" for the library, if
-necessary.  Here is a sample; alter the names:
-
-  Yoyodyne, Inc., hereby disclaims all copyright interest in the
-  library `Frob' (a library for tweaking knobs) written by James Random Hacker.
-
-  , 1 April 1990
-  Ty Coon, President of Vice
-
-That's all there is to it!
-
-
diff --git a/lib/sub_repos/chardet/MANIFEST.in b/lib/sub_repos/chardet/MANIFEST.in
deleted file mode 100644
index be5768dd9..000000000
--- a/lib/sub_repos/chardet/MANIFEST.in
+++ /dev/null
@@ -1,8 +0,0 @@
-include LICENSE
-include *.rst
-include requirements.txt
-include test.py
-recursive-include docs *
-recursive-include tests *
-global-exclude *.pyc
-global-exclude __pycache__
diff --git a/lib/sub_repos/chardet/NOTES.rst b/lib/sub_repos/chardet/NOTES.rst
deleted file mode 100644
index 998db58d4..000000000
--- a/lib/sub_repos/chardet/NOTES.rst
+++ /dev/null
@@ -1,140 +0,0 @@
-Class Hierarchy for chardet
-===========================
-
-Universal Detector
-------------------
-Has a list of probers.
-
-CharSetProber
--------------
-Mostly abstract parent class.
-
-CharSetGroupProber
-------------------
-Runs a bunch of related probers at the same time and decides which is best.
-
-SBCSGroupProber
----------------
-SBCS = Single-ByteCharSet. Runs a bunch of SingleByteCharSetProbers.  Always
-contains the same SingleByteCharSetProbers.
-
-SingleByteCharSetProber
------------------------
-A CharSetProber that is used for detecting single-byte encodings by using
-a "precedence matrix" (i.e., a character bigram model).
-
-MBCSGroupProber
----------------
-Runs a bunch of MultiByteCharSetProbers. It also uses a UTF8Prober, which is
-essentially a MultiByteCharSetProber that only has a state machine.  Always
-contains the same MultiByteCharSetProbers.
-
-MultiByteCharSetProber
-----------------------
-A CharSetProber that uses both a character unigram model (or "character
-distribution analysis") and an independent state machine for trying to
-detect and encoding.
-
-CodingStateMachine
-------------------
-Used for "coding scheme" detection, where we just look for either invalid
-byte sequences or sequences that only occur for that particular encoding.
-
-CharDistributionAnalysis
-------------------------
-Used for character unigram distribution encoding detection.  Takes a mapping
-from characters to a "frequency order" (i.e., what frequency rank that byte has
-in the given encoding) and a "typical distribution ratio", which is the number
-of occurrences of the 512 most frequently used characters divided by the number
-of occurrences of the rest of the characters for a typical document.
-The "characters" in this case are 2-byte sequences and they are first converted
-to an "order" (name comes from ord() function, I believe). This "order" is used
-to index into the frequency order table to determine the frequency rank of that
-byte sequence.  The reason this extra step is necessary is that the frequency
-rank table is language-specific (and not encoding-specific).
-
-
-What's where
-============
-
-
-Bigram files
-------------
-
-- ``hebrewprober.py``
-- ``jpcntxprober.py``
-- ``langbulgarianmodel.py``
-- ``langcyrillicmodel.py``
-- ``langgreekmodel.py``
-- ``langhebrewmodel.py``
-- ``langhungarianmodel.py``
-- ``langthaimodel.py``
-- ``latin1prober.py``
-- ``sbcharsetprober.py``
-- ``sbcsgroupprober.py``
-
-
-Coding Scheme files
--------------------
-
-- ``escprober.py``
-- ``escsm.py``
-- ``utf8prober.py``
-- ``codingstatemachine.py``
-- ``mbcssmprober.py``
-
-
-Unigram files
--------------
-
-- ``big5freqprober.py``
-- ``chardistribution.py``
-- ``euckrfreqprober.py``
-- ``euctwfreqprober.py``
-- ``gb2312freqprober.py``
-- ``jisfreqprober.py``
-
-Multibyte probers
------------------
-
-- ``big5prober.py``
-- ``cp949prober.py``
-- ``eucjpprober.py``
-- ``euckrprober.py``
-- ``euctwprober.py``
-- ``gb2312prober.py``
-- ``mbcharsetprober.py``
-- ``mbcsgroupprober.py``
-- ``sjisprober.py``
-
-Misc files
-----------
-
-- ``__init__.py`` (currently has ``detect`` function in it)
-- ``compat.py``
-- ``enums.py``
-- ``universaldetector.py``
-- ``version.py``
-
-
-Useful links
-============
-
-This is just a collection of information that I've found useful or thought
-might be useful in the future:
-
-- `BOM by Encoding`_
-
-- `A Composite Approach to Language/Encoding Detection`_
-
-- `What Every Programmer Absolutely...`_
-
-- The actual `source`_
-
-
-.. _BOM by Encoding:
-    https://en.wikipedia.org/wiki/Byte_order_mark#Byte_order_marks_by_encoding
-.. _A Composite Approach to Language/Encoding Detection:
-    http://www-archive.mozilla.org/projects/intl/UniversalCharsetDetection.html
-.. _What Every Programmer Absolutely...: http://kunststube.net/encoding/
-.. _source: https://dxr.mozilla.org/mozilla/source/intl/chardet/
diff --git a/lib/sub_repos/chardet/README.rst b/lib/sub_repos/chardet/README.rst
deleted file mode 100644
index 425cc0baa..000000000
--- a/lib/sub_repos/chardet/README.rst
+++ /dev/null
@@ -1,68 +0,0 @@
-Chardet: The Universal Character Encoding Detector
---------------------------------------------------
-
-.. image:: https://img.shields.io/travis/chardet/chardet/stable.svg
-   :alt: Build status
-   :target: https://travis-ci.org/chardet/chardet
-
-.. image:: https://img.shields.io/coveralls/chardet/chardet/stable.svg
-   :target: https://coveralls.io/r/chardet/chardet
-
-.. image:: https://img.shields.io/pypi/v/chardet.svg
-   :target: https://warehouse.python.org/project/chardet/
-   :alt: Latest version on PyPI
-
-.. image:: https://img.shields.io/pypi/l/chardet.svg
-   :alt: License
-
-
-Detects
- - ASCII, UTF-8, UTF-16 (2 variants), UTF-32 (4 variants)
- - Big5, GB2312, EUC-TW, HZ-GB-2312, ISO-2022-CN (Traditional and Simplified Chinese)
- - EUC-JP, SHIFT_JIS, CP932, ISO-2022-JP (Japanese)
- - EUC-KR, ISO-2022-KR (Korean)
- - KOI8-R, MacCyrillic, IBM855, IBM866, ISO-8859-5, windows-1251 (Cyrillic)
- - ISO-8859-5, windows-1251 (Bulgarian)
- - ISO-8859-1, windows-1252 (Western European languages)
- - ISO-8859-7, windows-1253 (Greek)
- - ISO-8859-8, windows-1255 (Visual and Logical Hebrew)
- - TIS-620 (Thai)
-
-.. note::
-   Our ISO-8859-2 and windows-1250 (Hungarian) probers have been temporarily
-   disabled until we can retrain the models.
-
-Requires Python 2.7 or 3.5+.
-
-Installation
-------------
-
-Install from `PyPI `_::
-
-    pip install chardet
-
-Documentation
--------------
-
-For users, docs are now available at https://chardet.readthedocs.io/.
-
-Command-line Tool
------------------
-
-chardet comes with a command-line script which reports on the encodings of one
-or more files::
-
-    % chardetect somefile someotherfile
-    somefile: windows-1252 with confidence 0.5
-    someotherfile: ascii with confidence 1.0
-
-About
------
-
-This is a continuation of Mark Pilgrim's excellent chardet. Previously, two
-versions needed to be maintained: one that supported python 2.x and one that
-supported python 3.x.  We've recently merged with `Ian Cordasco `_'s
-`charade `_ fork, so now we have one
-coherent version that works for Python 2.7+ and 3.4+.
-
-:maintainer: Dan Blanchard
diff --git a/lib/sub_repos/chardet/bench.py b/lib/sub_repos/chardet/bench.py
deleted file mode 100644
index 04dc1ffa8..000000000
--- a/lib/sub_repos/chardet/bench.py
+++ /dev/null
@@ -1,146 +0,0 @@
-"""
-Run chardet on a bunch of documents and see that we get the correct encodings.
-
-:author: Dan Blanchard
-:author: Ian Cordasco
-"""
-
-from __future__ import print_function, with_statement
-
-import argparse
-import sys
-import time
-from collections import defaultdict
-from io import open
-from os import listdir
-from os.path import dirname, isdir, join, realpath, relpath, splitext
-
-import chardet
-
-try:
-    import cchardet
-    HAVE_CCHARDET = True
-except:
-    HAVE_CCHARDET = False
-
-
-# TODO: Restore Hungarian encodings (iso-8859-2 and windows-1250) after we
-#       retrain model.
-MISSING_ENCODINGS = {'iso-8859-2', 'iso-8859-6', 'windows-1250',
-                     'windows-1254', 'windows-1256'}
-EXPECTED_FAILURES = {'tests/iso-8859-7-greek/disabled.gr.xml',
-                     'tests/iso-8859-9-turkish/divxplanet.com.xml',
-                     'tests/iso-8859-9-turkish/subtitle.srt',
-                     'tests/iso-8859-9-turkish/wikitop_tr_ISO-8859-9.txt'}
-
-def get_py_impl():
-    """Return what kind of Python this is"""
-    if hasattr(sys, 'pypy_version_info'):
-        pyimpl = 'PyPy'
-    elif sys.platform.startswith('java'):
-        pyimpl = 'Jython'
-    elif sys.platform == 'cli':
-        pyimpl = 'IronPython'
-    else:
-        pyimpl = 'CPython'
-    return pyimpl
-
-
-def get_test_files():
-    """Yields filenames to use for timing chardet.detect"""
-    base_path = relpath(join(dirname(realpath(__file__)), 'tests'))
-    for encoding in listdir(base_path):
-        path = join(base_path, encoding)
-        # Skip files in tests directory
-        if not isdir(path):
-            continue
-        # Remove language suffixes from encoding if pressent
-        encoding = encoding.lower()
-        for postfix in ['-arabic', '-bulgarian', '-cyrillic', '-greek',
-                        '-hebrew', '-hungarian', '-turkish']:
-            if encoding.endswith(postfix):
-                encoding = encoding.rpartition(postfix)[0]
-                break
-        # Skip directories for encodings we don't handle yet.
-        if encoding in MISSING_ENCODINGS:
-            continue
-        # Test encoding detection for each file we have of encoding for
-        for file_name in listdir(path):
-            ext = splitext(file_name)[1].lower()
-            if ext not in ['.html', '.txt', '.xml', '.srt']:
-                continue
-            full_path = join(path, file_name)
-            if full_path in EXPECTED_FAILURES:
-                continue
-            yield full_path, encoding
-
-
-def benchmark(chardet_mod=chardet, verbose=False, num_iters=10):
-    print('Benchmarking {} {} on {} {}'.format(chardet_mod.__name__,
-                                               chardet_mod.__version__,
-                                               get_py_impl(),
-                                               sys.version))
-    print('-' * 80)
-    total_time = 0
-    num_files = 0
-    encoding_times = defaultdict(float)
-    encoding_num_files = defaultdict(int)
-    for full_path, encoding in get_test_files():
-        num_files += 1
-        with open(full_path, 'rb') as f:
-            input_bytes = f.read()
-        start = time.time()
-        for _ in range(num_iters):
-            chardet_mod.detect(input_bytes)
-        bench_time = time.time() - start
-        if verbose:
-            print('Average time for {}: {}s'.format(full_path,
-                                                    bench_time / num_iters))
-        else:
-            print('.', end='')
-            sys.stdout.flush()
-        total_time += bench_time
-        encoding_times[encoding] += bench_time
-        encoding_num_files[encoding] += 1
-
-    print('\nCalls per second for each encoding:')
-    for encoding in sorted(encoding_times.keys()):
-        print('{}: {}'.format(encoding,
-                              num_iters * encoding_num_files[encoding] /
-                              encoding_times[encoding]))
-
-    print('\nTotal time: {}s ({} calls per second)'.format(total_time,
-                                                           num_iters * num_files /
-                                                           total_time))
-
-
-def main():
-    parser = argparse.ArgumentParser(
-        description='Times how long it takes to process each file in test set '
-            'multiple times.',
-        formatter_class=argparse.ArgumentDefaultsHelpFormatter)
-    parser.add_argument('-c', '--cchardet',
-                        action='store_true',
-                        help='Run benchmarks for cChardet instead of chardet, '
-                             'if it is installed.')
-    parser.add_argument('-i', '--iterations',
-                        help='Number of times to process each file',
-                        type=int,
-                        default=10)
-    parser.add_argument('-v', '--verbose',
-                        help='Prints out the timing for each individual file.',
-                        action='store_true')
-    args = parser.parse_args()
-
-    if args.cchardet and not HAVE_CCHARDET:
-        print('You must pip install cchardet if you want to benchmark it.')
-        sys.exit(1)
-
-
-    benchmark(chardet_mod=cchardet if args.cchardet else chardet,
-              verbose=args.verbose,
-              num_iters=args.iterations)
-
-
-if __name__ == '__main__':
-    main()
diff --git a/lib/sub_repos/chardet/chardet/__init__.py b/lib/sub_repos/chardet/chardet/__init__.py
deleted file mode 100644
index 80ad2546d..000000000
--- a/lib/sub_repos/chardet/chardet/__init__.py
+++ /dev/null
@@ -1,83 +0,0 @@
-######################## BEGIN LICENSE BLOCK ########################
-# This library is free software; you can redistribute it and/or
-# modify it under the terms of the GNU Lesser General Public
-# License as published by the Free Software Foundation; either
-# version 2.1 of the License, or (at your option) any later version.
-#
-# This library is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-# Lesser General Public License for more details.
-#
-# You should have received a copy of the GNU Lesser General Public
-# License along with this library; if not, write to the Free Software
-# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
-# 02110-1301  USA
-######################### END LICENSE BLOCK #########################
-
-
-from .universaldetector import UniversalDetector
-from .enums import InputState
-from .version import __version__, VERSION
-
-
-__all__ = ['UniversalDetector', 'detect', 'detect_all', '__version__', 'VERSION']
-
-
-def detect(byte_str):
-    """
-    Detect the encoding of the given byte string.
-
-    :param byte_str:     The byte sequence to examine.
-    :type byte_str:      ``bytes`` or ``bytearray``
-    """
-    if not isinstance(byte_str, bytearray):
-        if not isinstance(byte_str, bytes):
-            raise TypeError('Expected object of type bytes or bytearray, got: '
-                            '{}'.format(type(byte_str)))
-        else:
-            byte_str = bytearray(byte_str)
-    detector = UniversalDetector()
-    detector.feed(byte_str)
-    return detector.close()
-
-
-def detect_all(byte_str):
-    """
-    Detect all the possible encodings of the given byte string.
-
-    :param byte_str:     The byte sequence to examine.
-    :type byte_str:      ``bytes`` or ``bytearray``
-    """
-    if not isinstance(byte_str, bytearray):
-        if not isinstance(byte_str, bytes):
-            raise TypeError('Expected object of type bytes or bytearray, got: '
-                            '{}'.format(type(byte_str)))
-        else:
-            byte_str = bytearray(byte_str)
-
-    detector = UniversalDetector()
-    detector.feed(byte_str)
-    detector.close()
-
-    if detector._input_state == InputState.HIGH_BYTE:
-        results = []
-        for prober in detector._charset_probers:
-            if prober.get_confidence() > detector.MINIMUM_THRESHOLD:
-                charset_name = prober.charset_name
-                lower_charset_name = prober.charset_name.lower()
-                # Use Windows encoding name instead of ISO-8859 if we saw any
-                # extra Windows-specific bytes
-                if lower_charset_name.startswith('iso-8859'):
-                    if detector._has_win_bytes:
-                        charset_name = detector.ISO_WIN_MAP.get(lower_charset_name,
-                                                            charset_name)
-                results.append({
-                    'encoding': charset_name,
-                    'confidence': prober.get_confidence(),
-                    'language': prober.language,
-                })
-        if len(results) > 0:
-            return sorted(results, key=lambda result: -result['confidence'])
-
-    return [detector.result]
diff --git a/lib/sub_repos/chardet/chardet/big5freq.py b/lib/sub_repos/chardet/chardet/big5freq.py
deleted file mode 100644
index 38f32517a..000000000
--- a/lib/sub_repos/chardet/chardet/big5freq.py
+++ /dev/null
@@ -1,386 +0,0 @@
-######################## BEGIN LICENSE BLOCK ########################
-# The Original Code is Mozilla Communicator client code.
-#
-# The Initial Developer of the Original Code is
-# Netscape Communications Corporation.
-# Portions created by the Initial Developer are Copyright (C) 1998
-# the Initial Developer. All Rights Reserved.
-#
-# Contributor(s):
-#   Mark Pilgrim - port to Python
-#
-# This library is free software; you can redistribute it and/or
-# modify it under the terms of the GNU Lesser General Public
-# License as published by the Free Software Foundation; either
-# version 2.1 of the License, or (at your option) any later version.
-#
-# This library is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-# Lesser General Public License for more details.
-#
-# You should have received a copy of the GNU Lesser General Public
-# License along with this library; if not, write to the Free Software
-# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
-# 02110-1301  USA
-######################### END LICENSE BLOCK #########################
-
-# Big5 frequency table
-# by Taiwan's Mandarin Promotion Council
-# 
-#
-# 128  --> 0.42261
-# 256  --> 0.57851
-# 512  --> 0.74851
-# 1024 --> 0.89384
-# 2048 --> 0.97583
-#
-# Ideal Distribution Ratio = 0.74851/(1-0.74851) =2.98
-# Random Distribution Ration = 512/(5401-512)=0.105
-#
-# Typical Distribution Ratio about 25% of Ideal one, still much higher than RDR
-
-BIG5_TYPICAL_DISTRIBUTION_RATIO = 0.75
-
-#Char to FreqOrder table
-BIG5_TABLE_SIZE = 5376
-
-BIG5_CHAR_TO_FREQ_ORDER = (
-   1,1801,1506, 255,1431, 198,   9,  82,   6,5008, 177, 202,3681,1256,2821, 110, #   16
-3814,  33,3274, 261,  76,  44,2114,  16,2946,2187,1176, 659,3971,  26,3451,2653, #   32
-1198,3972,3350,4202, 410,2215, 302, 590, 361,1964,   8, 204,  58,4510,5009,1932, #   48
-  63,5010,5011, 317,1614,  75, 222, 159,4203,2417,1480,5012,3555,3091, 224,2822, #   64
-3682,   3,  10,3973,1471,  29,2787,1135,2866,1940, 873, 130,3275,1123, 312,5013, #   80
-4511,2052, 507, 252, 682,5014, 142,1915, 124, 206,2947,  34,3556,3204,  64, 604, #   96
-5015,2501,1977,1978, 155,1991, 645, 641,1606,5016,3452, 337,  72, 406,5017,  80, #  112
- 630, 238,3205,1509, 263, 939,1092,2654, 756,1440,1094,3453, 449,  69,2987, 591, #  128
- 179,2096, 471, 115,2035,1844,  60,  50,2988, 134, 806,1869, 734,2036,3454, 180, #  144
- 995,1607, 156, 537,2907, 688,5018, 319,1305, 779,2145, 514,2379, 298,4512, 359, #  160
-2502,  90,2716,1338, 663,  11, 906,1099,2553,  20,2441, 182, 532,1716,5019, 732, #  176
-1376,4204,1311,1420,3206,  25,2317,1056, 113, 399, 382,1950, 242,3455,2474, 529, #  192
-3276, 475,1447,3683,5020, 117,  21, 656, 810,1297,2300,2334,3557,5021, 126,4205, #  208
- 706, 456, 150, 613,4513,  71,1118,2037,4206, 145,3092,  85, 835, 486,2115,1246, #  224
-1426, 428, 727,1285,1015, 800, 106, 623, 303,1281,5022,2128,2359, 347,3815, 221, #  240
-3558,3135,5023,1956,1153,4207,  83, 296,1199,3093, 192, 624,  93,5024, 822,1898, #  256
-2823,3136, 795,2065, 991,1554,1542,1592,  27,  43,2867, 859, 139,1456, 860,4514, #  272
- 437, 712,3974, 164,2397,3137, 695, 211,3037,2097, 195,3975,1608,3559,3560,3684, #  288
-3976, 234, 811,2989,2098,3977,2233,1441,3561,1615,2380, 668,2077,1638, 305, 228, #  304
-1664,4515, 467, 415,5025, 262,2099,1593, 239, 108, 300, 200,1033, 512,1247,2078, #  320
-5026,5027,2176,3207,3685,2682, 593, 845,1062,3277,  88,1723,2038,3978,1951, 212, #  336
- 266, 152, 149, 468,1899,4208,4516,  77, 187,5028,3038,  37,   5,2990,5029,3979, #  352
-5030,5031,  39,2524,4517,2908,3208,2079,  55, 148,  74,4518, 545, 483,1474,1029, #  368
-1665, 217,1870,1531,3138,1104,2655,4209,  24, 172,3562, 900,3980,3563,3564,4519, #  384
-  32,1408,2824,1312, 329, 487,2360,2251,2717, 784,2683,   4,3039,3351,1427,1789, #  400
- 188, 109, 499,5032,3686,1717,1790, 888,1217,3040,4520,5033,3565,5034,3352,1520, #  416
-3687,3981, 196,1034, 775,5035,5036, 929,1816, 249, 439,  38,5037,1063,5038, 794, #  432
-3982,1435,2301,  46, 178,3278,2066,5039,2381,5040, 214,1709,4521, 804,  35, 707, #  448
- 324,3688,1601,2554, 140, 459,4210,5041,5042,1365, 839, 272, 978,2262,2580,3456, #  464
-2129,1363,3689,1423, 697, 100,3094,  48,  70,1231, 495,3139,2196,5043,1294,5044, #  480
-2080, 462, 586,1042,3279, 853, 256, 988, 185,2382,3457,1698, 434,1084,5045,3458, #  496
- 314,2625,2788,4522,2335,2336, 569,2285, 637,1817,2525, 757,1162,1879,1616,3459, #  512
- 287,1577,2116, 768,4523,1671,2868,3566,2526,1321,3816, 909,2418,5046,4211, 933, #  528
-3817,4212,2053,2361,1222,4524, 765,2419,1322, 786,4525,5047,1920,1462,1677,2909, #  544
-1699,5048,4526,1424,2442,3140,3690,2600,3353,1775,1941,3460,3983,4213, 309,1369, #  560
-1130,2825, 364,2234,1653,1299,3984,3567,3985,3986,2656, 525,1085,3041, 902,2001, #  576
-1475, 964,4527, 421,1845,1415,1057,2286, 940,1364,3141, 376,4528,4529,1381,   7, #  592
-2527, 983,2383, 336,1710,2684,1846, 321,3461, 559,1131,3042,2752,1809,1132,1313, #  608
- 265,1481,1858,5049, 352,1203,2826,3280, 167,1089, 420,2827, 776, 792,1724,3568, #  624
-4214,2443,3281,5050,4215,5051, 446, 229, 333,2753, 901,3818,1200,1557,4530,2657, #  640
-1921, 395,2754,2685,3819,4216,1836, 125, 916,3209,2626,4531,5052,5053,3820,5054, #  656
-5055,5056,4532,3142,3691,1133,2555,1757,3462,1510,2318,1409,3569,5057,2146, 438, #  672
-2601,2910,2384,3354,1068, 958,3043, 461, 311,2869,2686,4217,1916,3210,4218,1979, #  688
- 383, 750,2755,2627,4219, 274, 539, 385,1278,1442,5058,1154,1965, 384, 561, 210, #  704
-  98,1295,2556,3570,5059,1711,2420,1482,3463,3987,2911,1257, 129,5060,3821, 642, #  720
- 523,2789,2790,2658,5061, 141,2235,1333,  68, 176, 441, 876, 907,4220, 603,2602, #  736
- 710, 171,3464, 404, 549,  18,3143,2398,1410,3692,1666,5062,3571,4533,2912,4534, #  752
-5063,2991, 368,5064, 146, 366,  99, 871,3693,1543, 748, 807,1586,1185,  22,2263, #  768
- 379,3822,3211,5065,3212, 505,1942,2628,1992,1382,2319,5066, 380,2362, 218, 702, #  784
-1818,1248,3465,3044,3572,3355,3282,5067,2992,3694, 930,3283,3823,5068,  59,5069, #  800
- 585, 601,4221, 497,3466,1112,1314,4535,1802,5070,1223,1472,2177,5071, 749,1837, #  816
- 690,1900,3824,1773,3988,1476, 429,1043,1791,2236,2117, 917,4222, 447,1086,1629, #  832
-5072, 556,5073,5074,2021,1654, 844,1090, 105, 550, 966,1758,2828,1008,1783, 686, #  848
-1095,5075,2287, 793,1602,5076,3573,2603,4536,4223,2948,2302,4537,3825, 980,2503, #  864
- 544, 353, 527,4538, 908,2687,2913,5077, 381,2629,1943,1348,5078,1341,1252, 560, #  880
-3095,5079,3467,2870,5080,2054, 973, 886,2081, 143,4539,5081,5082, 157,3989, 496, #  896
-4224,  57, 840, 540,2039,4540,4541,3468,2118,1445, 970,2264,1748,1966,2082,4225, #  912
-3144,1234,1776,3284,2829,3695, 773,1206,2130,1066,2040,1326,3990,1738,1725,4226, #  928
- 279,3145,  51,1544,2604, 423,1578,2131,2067, 173,4542,1880,5083,5084,1583, 264, #  944
- 610,3696,4543,2444, 280, 154,5085,5086,5087,1739, 338,1282,3096, 693,2871,1411, #  960
-1074,3826,2445,5088,4544,5089,5090,1240, 952,2399,5091,2914,1538,2688, 685,1483, #  976
-4227,2475,1436, 953,4228,2055,4545, 671,2400,  79,4229,2446,3285, 608, 567,2689, #  992
-3469,4230,4231,1691, 393,1261,1792,2401,5092,4546,5093,5094,5095,5096,1383,1672, # 1008
-3827,3213,1464, 522,1119, 661,1150, 216, 675,4547,3991,1432,3574, 609,4548,2690, # 1024
-2402,5097,5098,5099,4232,3045,   0,5100,2476, 315, 231,2447, 301,3356,4549,2385, # 1040
-5101, 233,4233,3697,1819,4550,4551,5102,  96,1777,1315,2083,5103, 257,5104,1810, # 1056
-3698,2718,1139,1820,4234,2022,1124,2164,2791,1778,2659,5105,3097, 363,1655,3214, # 1072
-5106,2993,5107,5108,5109,3992,1567,3993, 718, 103,3215, 849,1443, 341,3357,2949, # 1088
-1484,5110,1712, 127,  67, 339,4235,2403, 679,1412, 821,5111,5112, 834, 738, 351, # 1104
-2994,2147, 846, 235,1497,1881, 418,1993,3828,2719, 186,1100,2148,2756,3575,1545, # 1120
-1355,2950,2872,1377, 583,3994,4236,2581,2995,5113,1298,3699,1078,2557,3700,2363, # 1136
-  78,3829,3830, 267,1289,2100,2002,1594,4237, 348, 369,1274,2197,2178,1838,4552, # 1152
-1821,2830,3701,2757,2288,2003,4553,2951,2758, 144,3358, 882,4554,3995,2759,3470, # 1168
-4555,2915,5114,4238,1726, 320,5115,3996,3046, 788,2996,5116,2831,1774,1327,2873, # 1184
-3997,2832,5117,1306,4556,2004,1700,3831,3576,2364,2660, 787,2023, 506, 824,3702, # 1200
- 534, 323,4557,1044,3359,2024,1901, 946,3471,5118,1779,1500,1678,5119,1882,4558, # 1216
- 165, 243,4559,3703,2528, 123, 683,4239, 764,4560,  36,3998,1793, 589,2916, 816, # 1232
- 626,1667,3047,2237,1639,1555,1622,3832,3999,5120,4000,2874,1370,1228,1933, 891, # 1248
-2084,2917, 304,4240,5121, 292,2997,2720,3577, 691,2101,4241,1115,4561, 118, 662, # 1264
-5122, 611,1156, 854,2386,1316,2875,   2, 386, 515,2918,5123,5124,3286, 868,2238, # 1280
-1486, 855,2661, 785,2216,3048,5125,1040,3216,3578,5126,3146, 448,5127,1525,5128, # 1296
-2165,4562,5129,3833,5130,4242,2833,3579,3147, 503, 818,4001,3148,1568, 814, 676, # 1312
-1444, 306,1749,5131,3834,1416,1030, 197,1428, 805,2834,1501,4563,5132,5133,5134, # 1328
-1994,5135,4564,5136,5137,2198,  13,2792,3704,2998,3149,1229,1917,5138,3835,2132, # 1344
-5139,4243,4565,2404,3580,5140,2217,1511,1727,1120,5141,5142, 646,3836,2448, 307, # 1360
-5143,5144,1595,3217,5145,5146,5147,3705,1113,1356,4002,1465,2529,2530,5148, 519, # 1376
-5149, 128,2133,  92,2289,1980,5150,4003,1512, 342,3150,2199,5151,2793,2218,1981, # 1392
-3360,4244, 290,1656,1317, 789, 827,2365,5152,3837,4566, 562, 581,4004,5153, 401, # 1408
-4567,2252,  94,4568,5154,1399,2794,5155,1463,2025,4569,3218,1944,5156, 828,1105, # 1424
-4245,1262,1394,5157,4246, 605,4570,5158,1784,2876,5159,2835, 819,2102, 578,2200, # 1440
-2952,5160,1502, 436,3287,4247,3288,2836,4005,2919,3472,3473,5161,2721,2320,5162, # 1456
-5163,2337,2068,  23,4571, 193, 826,3838,2103, 699,1630,4248,3098, 390,1794,1064, # 1472
-3581,5164,1579,3099,3100,1400,5165,4249,1839,1640,2877,5166,4572,4573, 137,4250, # 1488
- 598,3101,1967, 780, 104, 974,2953,5167, 278, 899, 253, 402, 572, 504, 493,1339, # 1504
-5168,4006,1275,4574,2582,2558,5169,3706,3049,3102,2253, 565,1334,2722, 863,  41, # 1520
-5170,5171,4575,5172,1657,2338,  19, 463,2760,4251, 606,5173,2999,3289,1087,2085, # 1536
-1323,2662,3000,5174,1631,1623,1750,4252,2691,5175,2878, 791,2723,2663,2339, 232, # 1552
-2421,5176,3001,1498,5177,2664,2630, 755,1366,3707,3290,3151,2026,1609, 119,1918, # 1568
-3474, 862,1026,4253,5178,4007,3839,4576,4008,4577,2265,1952,2477,5179,1125, 817, # 1584
-4254,4255,4009,1513,1766,2041,1487,4256,3050,3291,2837,3840,3152,5180,5181,1507, # 1600
-5182,2692, 733,  40,1632,1106,2879, 345,4257, 841,2531, 230,4578,3002,1847,3292, # 1616
-3475,5183,1263, 986,3476,5184, 735, 879, 254,1137, 857, 622,1300,1180,1388,1562, # 1632
-4010,4011,2954, 967,2761,2665,1349, 592,2134,1692,3361,3003,1995,4258,1679,4012, # 1648
-1902,2188,5185, 739,3708,2724,1296,1290,5186,4259,2201,2202,1922,1563,2605,2559, # 1664
-1871,2762,3004,5187, 435,5188, 343,1108, 596,  17,1751,4579,2239,3477,3709,5189, # 1680
-4580, 294,3582,2955,1693, 477, 979, 281,2042,3583, 643,2043,3710,2631,2795,2266, # 1696
-1031,2340,2135,2303,3584,4581, 367,1249,2560,5190,3585,5191,4582,1283,3362,2005, # 1712
- 240,1762,3363,4583,4584, 836,1069,3153, 474,5192,2149,2532, 268,3586,5193,3219, # 1728
-1521,1284,5194,1658,1546,4260,5195,3587,3588,5196,4261,3364,2693,1685,4262, 961, # 1744
-1673,2632, 190,2006,2203,3841,4585,4586,5197, 570,2504,3711,1490,5198,4587,2633, # 1760
-3293,1957,4588, 584,1514, 396,1045,1945,5199,4589,1968,2449,5200,5201,4590,4013, # 1776
- 619,5202,3154,3294, 215,2007,2796,2561,3220,4591,3221,4592, 763,4263,3842,4593, # 1792
-5203,5204,1958,1767,2956,3365,3712,1174, 452,1477,4594,3366,3155,5205,2838,1253, # 1808
-2387,2189,1091,2290,4264, 492,5206, 638,1169,1825,2136,1752,4014, 648, 926,1021, # 1824
-1324,4595, 520,4596, 997, 847,1007, 892,4597,3843,2267,1872,3713,2405,1785,4598, # 1840
-1953,2957,3103,3222,1728,4265,2044,3714,4599,2008,1701,3156,1551,  30,2268,4266, # 1856
-5207,2027,4600,3589,5208, 501,5209,4267, 594,3478,2166,1822,3590,3479,3591,3223, # 1872
- 829,2839,4268,5210,1680,3157,1225,4269,5211,3295,4601,4270,3158,2341,5212,4602, # 1888
-4271,5213,4015,4016,5214,1848,2388,2606,3367,5215,4603, 374,4017, 652,4272,4273, # 1904
- 375,1140, 798,5216,5217,5218,2366,4604,2269, 546,1659, 138,3051,2450,4605,5219, # 1920
-2254, 612,1849, 910, 796,3844,1740,1371, 825,3845,3846,5220,2920,2562,5221, 692, # 1936
- 444,3052,2634, 801,4606,4274,5222,1491, 244,1053,3053,4275,4276, 340,5223,4018, # 1952
-1041,3005, 293,1168,  87,1357,5224,1539, 959,5225,2240, 721, 694,4277,3847, 219, # 1968
-1478, 644,1417,3368,2666,1413,1401,1335,1389,4019,5226,5227,3006,2367,3159,1826, # 1984
- 730,1515, 184,2840,  66,4607,5228,1660,2958, 246,3369, 378,1457, 226,3480, 975, # 2000
-4020,2959,1264,3592, 674, 696,5229, 163,5230,1141,2422,2167, 713,3593,3370,4608, # 2016
-4021,5231,5232,1186,  15,5233,1079,1070,5234,1522,3224,3594, 276,1050,2725, 758, # 2032
-1126, 653,2960,3296,5235,2342, 889,3595,4022,3104,3007, 903,1250,4609,4023,3481, # 2048
-3596,1342,1681,1718, 766,3297, 286,  89,2961,3715,5236,1713,5237,2607,3371,3008, # 2064
-5238,2962,2219,3225,2880,5239,4610,2505,2533, 181, 387,1075,4024, 731,2190,3372, # 2080
-5240,3298, 310, 313,3482,2304, 770,4278,  54,3054, 189,4611,3105,3848,4025,5241, # 2096
-1230,1617,1850, 355,3597,4279,4612,3373, 111,4280,3716,1350,3160,3483,3055,4281, # 2112
-2150,3299,3598,5242,2797,4026,4027,3009, 722,2009,5243,1071, 247,1207,2343,2478, # 2128
-1378,4613,2010, 864,1437,1214,4614, 373,3849,1142,2220, 667,4615, 442,2763,2563, # 2144
-3850,4028,1969,4282,3300,1840, 837, 170,1107, 934,1336,1883,5244,5245,2119,4283, # 2160
-2841, 743,1569,5246,4616,4284, 582,2389,1418,3484,5247,1803,5248, 357,1395,1729, # 2176
-3717,3301,2423,1564,2241,5249,3106,3851,1633,4617,1114,2086,4285,1532,5250, 482, # 2192
-2451,4618,5251,5252,1492, 833,1466,5253,2726,3599,1641,2842,5254,1526,1272,3718, # 2208
-4286,1686,1795, 416,2564,1903,1954,1804,5255,3852,2798,3853,1159,2321,5256,2881, # 2224
-4619,1610,1584,3056,2424,2764, 443,3302,1163,3161,5257,5258,4029,5259,4287,2506, # 2240
-3057,4620,4030,3162,2104,1647,3600,2011,1873,4288,5260,4289, 431,3485,5261, 250, # 2256
-  97,  81,4290,5262,1648,1851,1558, 160, 848,5263, 866, 740,1694,5264,2204,2843, # 2272
-3226,4291,4621,3719,1687, 950,2479, 426, 469,3227,3720,3721,4031,5265,5266,1188, # 2288
- 424,1996, 861,3601,4292,3854,2205,2694, 168,1235,3602,4293,5267,2087,1674,4622, # 2304
-3374,3303, 220,2565,1009,5268,3855, 670,3010, 332,1208, 717,5269,5270,3603,2452, # 2320
-4032,3375,5271, 513,5272,1209,2882,3376,3163,4623,1080,5273,5274,5275,5276,2534, # 2336
-3722,3604, 815,1587,4033,4034,5277,3605,3486,3856,1254,4624,1328,3058,1390,4035, # 2352
-1741,4036,3857,4037,5278, 236,3858,2453,3304,5279,5280,3723,3859,1273,3860,4625, # 2368
-5281, 308,5282,4626, 245,4627,1852,2480,1307,2583, 430, 715,2137,2454,5283, 270, # 2384
- 199,2883,4038,5284,3606,2727,1753, 761,1754, 725,1661,1841,4628,3487,3724,5285, # 2400
-5286, 587,  14,3305, 227,2608, 326, 480,2270, 943,2765,3607, 291, 650,1884,5287, # 2416
-1702,1226, 102,1547,  62,3488, 904,4629,3489,1164,4294,5288,5289,1224,1548,2766, # 2432
- 391, 498,1493,5290,1386,1419,5291,2056,1177,4630, 813, 880,1081,2368, 566,1145, # 2448
-4631,2291,1001,1035,2566,2609,2242, 394,1286,5292,5293,2069,5294,  86,1494,1730, # 2464
-4039, 491,1588, 745, 897,2963, 843,3377,4040,2767,2884,3306,1768, 998,2221,2070, # 2480
- 397,1827,1195,1970,3725,3011,3378, 284,5295,3861,2507,2138,2120,1904,5296,4041, # 2496
-2151,4042,4295,1036,3490,1905, 114,2567,4296, 209,1527,5297,5298,2964,2844,2635, # 2512
-2390,2728,3164, 812,2568,5299,3307,5300,1559, 737,1885,3726,1210, 885,  28,2695, # 2528
-3608,3862,5301,4297,1004,1780,4632,5302, 346,1982,2222,2696,4633,3863,1742, 797, # 2544
-1642,4043,1934,1072,1384,2152, 896,4044,3308,3727,3228,2885,3609,5303,2569,1959, # 2560
-4634,2455,1786,5304,5305,5306,4045,4298,1005,1308,3728,4299,2729,4635,4636,1528, # 2576
-2610, 161,1178,4300,1983, 987,4637,1101,4301, 631,4046,1157,3229,2425,1343,1241, # 2592
-1016,2243,2570, 372, 877,2344,2508,1160, 555,1935, 911,4047,5307, 466,1170, 169, # 2608
-1051,2921,2697,3729,2481,3012,1182,2012,2571,1251,2636,5308, 992,2345,3491,1540, # 2624
-2730,1201,2071,2406,1997,2482,5309,4638, 528,1923,2191,1503,1874,1570,2369,3379, # 2640
-3309,5310, 557,1073,5311,1828,3492,2088,2271,3165,3059,3107, 767,3108,2799,4639, # 2656
-1006,4302,4640,2346,1267,2179,3730,3230, 778,4048,3231,2731,1597,2667,5312,4641, # 2672
-5313,3493,5314,5315,5316,3310,2698,1433,3311, 131,  95,1504,4049, 723,4303,3166, # 2688
-1842,3610,2768,2192,4050,2028,2105,3731,5317,3013,4051,1218,5318,3380,3232,4052, # 2704
-4304,2584, 248,1634,3864, 912,5319,2845,3732,3060,3865, 654,  53,5320,3014,5321, # 2720
-1688,4642, 777,3494,1032,4053,1425,5322, 191, 820,2121,2846, 971,4643, 931,3233, # 2736
- 135, 664, 783,3866,1998, 772,2922,1936,4054,3867,4644,2923,3234, 282,2732, 640, # 2752
-1372,3495,1127, 922, 325,3381,5323,5324, 711,2045,5325,5326,4055,2223,2800,1937, # 2768
-4056,3382,2224,2255,3868,2305,5327,4645,3869,1258,3312,4057,3235,2139,2965,4058, # 2784
-4059,5328,2225, 258,3236,4646, 101,1227,5329,3313,1755,5330,1391,3314,5331,2924, # 2800
-2057, 893,5332,5333,5334,1402,4305,2347,5335,5336,3237,3611,5337,5338, 878,1325, # 2816
-1781,2801,4647, 259,1385,2585, 744,1183,2272,4648,5339,4060,2509,5340, 684,1024, # 2832
-4306,5341, 472,3612,3496,1165,3315,4061,4062, 322,2153, 881, 455,1695,1152,1340, # 2848
- 660, 554,2154,4649,1058,4650,4307, 830,1065,3383,4063,4651,1924,5342,1703,1919, # 2864
-5343, 932,2273, 122,5344,4652, 947, 677,5345,3870,2637, 297,1906,1925,2274,4653, # 2880
-2322,3316,5346,5347,4308,5348,4309,  84,4310, 112, 989,5349, 547,1059,4064, 701, # 2896
-3613,1019,5350,4311,5351,3497, 942, 639, 457,2306,2456, 993,2966, 407, 851, 494, # 2912
-4654,3384, 927,5352,1237,5353,2426,3385, 573,4312, 680, 921,2925,1279,1875, 285, # 2928
- 790,1448,1984, 719,2168,5354,5355,4655,4065,4066,1649,5356,1541, 563,5357,1077, # 2944
-5358,3386,3061,3498, 511,3015,4067,4068,3733,4069,1268,2572,3387,3238,4656,4657, # 2960
-5359, 535,1048,1276,1189,2926,2029,3167,1438,1373,2847,2967,1134,2013,5360,4313, # 2976
-1238,2586,3109,1259,5361, 700,5362,2968,3168,3734,4314,5363,4315,1146,1876,1907, # 2992
-4658,2611,4070, 781,2427, 132,1589, 203, 147, 273,2802,2407, 898,1787,2155,4071, # 3008
-4072,5364,3871,2803,5365,5366,4659,4660,5367,3239,5368,1635,3872, 965,5369,1805, # 3024
-2699,1516,3614,1121,1082,1329,3317,4073,1449,3873,  65,1128,2848,2927,2769,1590, # 3040
-3874,5370,5371,  12,2668,  45, 976,2587,3169,4661, 517,2535,1013,1037,3240,5372, # 3056
-3875,2849,5373,3876,5374,3499,5375,2612, 614,1999,2323,3877,3110,2733,2638,5376, # 3072
-2588,4316, 599,1269,5377,1811,3735,5378,2700,3111, 759,1060, 489,1806,3388,3318, # 3088
-1358,5379,5380,2391,1387,1215,2639,2256, 490,5381,5382,4317,1759,2392,2348,5383, # 3104
-4662,3878,1908,4074,2640,1807,3241,4663,3500,3319,2770,2349, 874,5384,5385,3501, # 3120
-3736,1859,  91,2928,3737,3062,3879,4664,5386,3170,4075,2669,5387,3502,1202,1403, # 3136
-3880,2969,2536,1517,2510,4665,3503,2511,5388,4666,5389,2701,1886,1495,1731,4076, # 3152
-2370,4667,5390,2030,5391,5392,4077,2702,1216, 237,2589,4318,2324,4078,3881,4668, # 3168
-4669,2703,3615,3504, 445,4670,5393,5394,5395,5396,2771,  61,4079,3738,1823,4080, # 3184
-5397, 687,2046, 935, 925, 405,2670, 703,1096,1860,2734,4671,4081,1877,1367,2704, # 3200
-3389, 918,2106,1782,2483, 334,3320,1611,1093,4672, 564,3171,3505,3739,3390, 945, # 3216
-2641,2058,4673,5398,1926, 872,4319,5399,3506,2705,3112, 349,4320,3740,4082,4674, # 3232
-3882,4321,3741,2156,4083,4675,4676,4322,4677,2408,2047, 782,4084, 400, 251,4323, # 3248
-1624,5400,5401, 277,3742, 299,1265, 476,1191,3883,2122,4324,4325,1109, 205,5402, # 3264
-2590,1000,2157,3616,1861,5403,5404,5405,4678,5406,4679,2573, 107,2484,2158,4085, # 3280
-3507,3172,5407,1533, 541,1301, 158, 753,4326,2886,3617,5408,1696, 370,1088,4327, # 3296
-4680,3618, 579, 327, 440, 162,2244, 269,1938,1374,3508, 968,3063,  56,1396,3113, # 3312
-2107,3321,3391,5409,1927,2159,4681,3016,5410,3619,5411,5412,3743,4682,2485,5413, # 3328
-2804,5414,1650,4683,5415,2613,5416,5417,4086,2671,3392,1149,3393,4087,3884,4088, # 3344
-5418,1076,  49,5419, 951,3242,3322,3323, 450,2850, 920,5420,1812,2805,2371,4328, # 3360
-1909,1138,2372,3885,3509,5421,3243,4684,1910,1147,1518,2428,4685,3886,5422,4686, # 3376
-2393,2614, 260,1796,3244,5423,5424,3887,3324, 708,5425,3620,1704,5426,3621,1351, # 3392
-1618,3394,3017,1887, 944,4329,3395,4330,3064,3396,4331,5427,3744, 422, 413,1714, # 3408
-3325, 500,2059,2350,4332,2486,5428,1344,1911, 954,5429,1668,5430,5431,4089,2409, # 3424
-4333,3622,3888,4334,5432,2307,1318,2512,3114, 133,3115,2887,4687, 629,  31,2851, # 3440
-2706,3889,4688, 850, 949,4689,4090,2970,1732,2089,4335,1496,1853,5433,4091, 620, # 3456
-3245, 981,1242,3745,3397,1619,3746,1643,3326,2140,2457,1971,1719,3510,2169,5434, # 3472
-3246,5435,5436,3398,1829,5437,1277,4690,1565,2048,5438,1636,3623,3116,5439, 869, # 3488
-2852, 655,3890,3891,3117,4092,3018,3892,1310,3624,4691,5440,5441,5442,1733, 558, # 3504
-4692,3747, 335,1549,3065,1756,4336,3748,1946,3511,1830,1291,1192, 470,2735,2108, # 3520
-2806, 913,1054,4093,5443,1027,5444,3066,4094,4693, 982,2672,3399,3173,3512,3247, # 3536
-3248,1947,2807,5445, 571,4694,5446,1831,5447,3625,2591,1523,2429,5448,2090, 984, # 3552
-4695,3749,1960,5449,3750, 852, 923,2808,3513,3751, 969,1519, 999,2049,2325,1705, # 3568
-5450,3118, 615,1662, 151, 597,4095,2410,2326,1049, 275,4696,3752,4337, 568,3753, # 3584
-3626,2487,4338,3754,5451,2430,2275, 409,3249,5452,1566,2888,3514,1002, 769,2853, # 3600
- 194,2091,3174,3755,2226,3327,4339, 628,1505,5453,5454,1763,2180,3019,4096, 521, # 3616
-1161,2592,1788,2206,2411,4697,4097,1625,4340,4341, 412,  42,3119, 464,5455,2642, # 3632
-4698,3400,1760,1571,2889,3515,2537,1219,2207,3893,2643,2141,2373,4699,4700,3328, # 3648
-1651,3401,3627,5456,5457,3628,2488,3516,5458,3756,5459,5460,2276,2092, 460,5461, # 3664
-4701,5462,3020, 962, 588,3629, 289,3250,2644,1116,  52,5463,3067,1797,5464,5465, # 3680
-5466,1467,5467,1598,1143,3757,4342,1985,1734,1067,4702,1280,3402, 465,4703,1572, # 3696
- 510,5468,1928,2245,1813,1644,3630,5469,4704,3758,5470,5471,2673,1573,1534,5472, # 3712
-5473, 536,1808,1761,3517,3894,3175,2645,5474,5475,5476,4705,3518,2929,1912,2809, # 3728
-5477,3329,1122, 377,3251,5478, 360,5479,5480,4343,1529, 551,5481,2060,3759,1769, # 3744
-2431,5482,2930,4344,3330,3120,2327,2109,2031,4706,1404, 136,1468,1479, 672,1171, # 3760
-3252,2308, 271,3176,5483,2772,5484,2050, 678,2736, 865,1948,4707,5485,2014,4098, # 3776
-2971,5486,2737,2227,1397,3068,3760,4708,4709,1735,2931,3403,3631,5487,3895, 509, # 3792
-2854,2458,2890,3896,5488,5489,3177,3178,4710,4345,2538,4711,2309,1166,1010, 552, # 3808
- 681,1888,5490,5491,2972,2973,4099,1287,1596,1862,3179, 358, 453, 736, 175, 478, # 3824
-1117, 905,1167,1097,5492,1854,1530,5493,1706,5494,2181,3519,2292,3761,3520,3632, # 3840
-4346,2093,4347,5495,3404,1193,2489,4348,1458,2193,2208,1863,1889,1421,3331,2932, # 3856
-3069,2182,3521, 595,2123,5496,4100,5497,5498,4349,1707,2646, 223,3762,1359, 751, # 3872
-3121, 183,3522,5499,2810,3021, 419,2374, 633, 704,3897,2394, 241,5500,5501,5502, # 3888
- 838,3022,3763,2277,2773,2459,3898,1939,2051,4101,1309,3122,2246,1181,5503,1136, # 3904
-2209,3899,2375,1446,4350,2310,4712,5504,5505,4351,1055,2615, 484,3764,5506,4102, # 3920
- 625,4352,2278,3405,1499,4353,4103,5507,4104,4354,3253,2279,2280,3523,5508,5509, # 3936
-2774, 808,2616,3765,3406,4105,4355,3123,2539, 526,3407,3900,4356, 955,5510,1620, # 3952
-4357,2647,2432,5511,1429,3766,1669,1832, 994, 928,5512,3633,1260,5513,5514,5515, # 3968
-1949,2293, 741,2933,1626,4358,2738,2460, 867,1184, 362,3408,1392,5516,5517,4106, # 3984
-4359,1770,1736,3254,2934,4713,4714,1929,2707,1459,1158,5518,3070,3409,2891,1292, # 4000
-1930,2513,2855,3767,1986,1187,2072,2015,2617,4360,5519,2574,2514,2170,3768,2490, # 4016
-3332,5520,3769,4715,5521,5522, 666,1003,3023,1022,3634,4361,5523,4716,1814,2257, # 4032
- 574,3901,1603, 295,1535, 705,3902,4362, 283, 858, 417,5524,5525,3255,4717,4718, # 4048
-3071,1220,1890,1046,2281,2461,4107,1393,1599, 689,2575, 388,4363,5526,2491, 802, # 4064
-5527,2811,3903,2061,1405,2258,5528,4719,3904,2110,1052,1345,3256,1585,5529, 809, # 4080
-5530,5531,5532, 575,2739,3524, 956,1552,1469,1144,2328,5533,2329,1560,2462,3635, # 4096
-3257,4108, 616,2210,4364,3180,2183,2294,5534,1833,5535,3525,4720,5536,1319,3770, # 4112
-3771,1211,3636,1023,3258,1293,2812,5537,5538,5539,3905, 607,2311,3906, 762,2892, # 4128
-1439,4365,1360,4721,1485,3072,5540,4722,1038,4366,1450,2062,2648,4367,1379,4723, # 4144
-2593,5541,5542,4368,1352,1414,2330,2935,1172,5543,5544,3907,3908,4724,1798,1451, # 4160
-5545,5546,5547,5548,2936,4109,4110,2492,2351, 411,4111,4112,3637,3333,3124,4725, # 4176
-1561,2674,1452,4113,1375,5549,5550,  47,2974, 316,5551,1406,1591,2937,3181,5552, # 4192
-1025,2142,3125,3182, 354,2740, 884,2228,4369,2412, 508,3772, 726,3638, 996,2433, # 4208
-3639, 729,5553, 392,2194,1453,4114,4726,3773,5554,5555,2463,3640,2618,1675,2813, # 4224
- 919,2352,2975,2353,1270,4727,4115,  73,5556,5557, 647,5558,3259,2856,2259,1550, # 4240
-1346,3024,5559,1332, 883,3526,5560,5561,5562,5563,3334,2775,5564,1212, 831,1347, # 4256
-4370,4728,2331,3909,1864,3073, 720,3910,4729,4730,3911,5565,4371,5566,5567,4731, # 4272
-5568,5569,1799,4732,3774,2619,4733,3641,1645,2376,4734,5570,2938, 669,2211,2675, # 4288
-2434,5571,2893,5572,5573,1028,3260,5574,4372,2413,5575,2260,1353,5576,5577,4735, # 4304
-3183, 518,5578,4116,5579,4373,1961,5580,2143,4374,5581,5582,3025,2354,2355,3912, # 4320
- 516,1834,1454,4117,2708,4375,4736,2229,2620,1972,1129,3642,5583,2776,5584,2976, # 4336
-1422, 577,1470,3026,1524,3410,5585,5586, 432,4376,3074,3527,5587,2594,1455,2515, # 4352
-2230,1973,1175,5588,1020,2741,4118,3528,4737,5589,2742,5590,1743,1361,3075,3529, # 4368
-2649,4119,4377,4738,2295, 895, 924,4378,2171, 331,2247,3076, 166,1627,3077,1098, # 4384
-5591,1232,2894,2231,3411,4739, 657, 403,1196,2377, 542,3775,3412,1600,4379,3530, # 4400
-5592,4740,2777,3261, 576, 530,1362,4741,4742,2540,2676,3776,4120,5593, 842,3913, # 4416
-5594,2814,2032,1014,4121, 213,2709,3413, 665, 621,4380,5595,3777,2939,2435,5596, # 4432
-2436,3335,3643,3414,4743,4381,2541,4382,4744,3644,1682,4383,3531,1380,5597, 724, # 4448
-2282, 600,1670,5598,1337,1233,4745,3126,2248,5599,1621,4746,5600, 651,4384,5601, # 4464
-1612,4385,2621,5602,2857,5603,2743,2312,3078,5604, 716,2464,3079, 174,1255,2710, # 4480
-4122,3645, 548,1320,1398, 728,4123,1574,5605,1891,1197,3080,4124,5606,3081,3082, # 4496
-3778,3646,3779, 747,5607, 635,4386,4747,5608,5609,5610,4387,5611,5612,4748,5613, # 4512
-3415,4749,2437, 451,5614,3780,2542,2073,4388,2744,4389,4125,5615,1764,4750,5616, # 4528
-4390, 350,4751,2283,2395,2493,5617,4391,4126,2249,1434,4127, 488,4752, 458,4392, # 4544
-4128,3781, 771,1330,2396,3914,2576,3184,2160,2414,1553,2677,3185,4393,5618,2494, # 4560
-2895,2622,1720,2711,4394,3416,4753,5619,2543,4395,5620,3262,4396,2778,5621,2016, # 4576
-2745,5622,1155,1017,3782,3915,5623,3336,2313, 201,1865,4397,1430,5624,4129,5625, # 4592
-5626,5627,5628,5629,4398,1604,5630, 414,1866, 371,2595,4754,4755,3532,2017,3127, # 4608
-4756,1708, 960,4399, 887, 389,2172,1536,1663,1721,5631,2232,4130,2356,2940,1580, # 4624
-5632,5633,1744,4757,2544,4758,4759,5634,4760,5635,2074,5636,4761,3647,3417,2896, # 4640
-4400,5637,4401,2650,3418,2815, 673,2712,2465, 709,3533,4131,3648,4402,5638,1148, # 4656
- 502, 634,5639,5640,1204,4762,3649,1575,4763,2623,3783,5641,3784,3128, 948,3263, # 4672
- 121,1745,3916,1110,5642,4403,3083,2516,3027,4132,3785,1151,1771,3917,1488,4133, # 4688
-1987,5643,2438,3534,5644,5645,2094,5646,4404,3918,1213,1407,2816, 531,2746,2545, # 4704
-3264,1011,1537,4764,2779,4405,3129,1061,5647,3786,3787,1867,2897,5648,2018, 120, # 4720
-4406,4407,2063,3650,3265,2314,3919,2678,3419,1955,4765,4134,5649,3535,1047,2713, # 4736
-1266,5650,1368,4766,2858, 649,3420,3920,2546,2747,1102,2859,2679,5651,5652,2000, # 4752
-5653,1111,3651,2977,5654,2495,3921,3652,2817,1855,3421,3788,5655,5656,3422,2415, # 4768
-2898,3337,3266,3653,5657,2577,5658,3654,2818,4135,1460, 856,5659,3655,5660,2899, # 4784
-2978,5661,2900,3922,5662,4408, 632,2517, 875,3923,1697,3924,2296,5663,5664,4767, # 4800
-3028,1239, 580,4768,4409,5665, 914, 936,2075,1190,4136,1039,2124,5666,5667,5668, # 4816
-5669,3423,1473,5670,1354,4410,3925,4769,2173,3084,4137, 915,3338,4411,4412,3339, # 4832
-1605,1835,5671,2748, 398,3656,4413,3926,4138, 328,1913,2860,4139,3927,1331,4414, # 4848
-3029, 937,4415,5672,3657,4140,4141,3424,2161,4770,3425, 524, 742, 538,3085,1012, # 4864
-5673,5674,3928,2466,5675, 658,1103, 225,3929,5676,5677,4771,5678,4772,5679,3267, # 4880
-1243,5680,4142, 963,2250,4773,5681,2714,3658,3186,5682,5683,2596,2332,5684,4774, # 4896
-5685,5686,5687,3536, 957,3426,2547,2033,1931,2941,2467, 870,2019,3659,1746,2780, # 4912
-2781,2439,2468,5688,3930,5689,3789,3130,3790,3537,3427,3791,5690,1179,3086,5691, # 4928
-3187,2378,4416,3792,2548,3188,3131,2749,4143,5692,3428,1556,2549,2297, 977,2901, # 4944
-2034,4144,1205,3429,5693,1765,3430,3189,2125,1271, 714,1689,4775,3538,5694,2333, # 4960
-3931, 533,4417,3660,2184, 617,5695,2469,3340,3539,2315,5696,5697,3190,5698,5699, # 4976
-3932,1988, 618, 427,2651,3540,3431,5700,5701,1244,1690,5702,2819,4418,4776,5703, # 4992
-3541,4777,5704,2284,1576, 473,3661,4419,3432, 972,5705,3662,5706,3087,5707,5708, # 5008
-4778,4779,5709,3793,4145,4146,5710, 153,4780, 356,5711,1892,2902,4420,2144, 408, # 5024
- 803,2357,5712,3933,5713,4421,1646,2578,2518,4781,4782,3934,5714,3935,4422,5715, # 5040
-2416,3433, 752,5716,5717,1962,3341,2979,5718, 746,3030,2470,4783,4423,3794, 698, # 5056
-4784,1893,4424,3663,2550,4785,3664,3936,5719,3191,3434,5720,1824,1302,4147,2715, # 5072
-3937,1974,4425,5721,4426,3192, 823,1303,1288,1236,2861,3542,4148,3435, 774,3938, # 5088
-5722,1581,4786,1304,2862,3939,4787,5723,2440,2162,1083,3268,4427,4149,4428, 344, # 5104
-1173, 288,2316, 454,1683,5724,5725,1461,4788,4150,2597,5726,5727,4789, 985, 894, # 5120
-5728,3436,3193,5729,1914,2942,3795,1989,5730,2111,1975,5731,4151,5732,2579,1194, # 5136
- 425,5733,4790,3194,1245,3796,4429,5734,5735,2863,5736, 636,4791,1856,3940, 760, # 5152
-1800,5737,4430,2212,1508,4792,4152,1894,1684,2298,5738,5739,4793,4431,4432,2213, # 5168
- 479,5740,5741, 832,5742,4153,2496,5743,2980,2497,3797, 990,3132, 627,1815,2652, # 5184
-4433,1582,4434,2126,2112,3543,4794,5744, 799,4435,3195,5745,4795,2113,1737,3031, # 5200
-1018, 543, 754,4436,3342,1676,4796,4797,4154,4798,1489,5746,3544,5747,2624,2903, # 5216
-4155,5748,5749,2981,5750,5751,5752,5753,3196,4799,4800,2185,1722,5754,3269,3270, # 5232
-1843,3665,1715, 481, 365,1976,1857,5755,5756,1963,2498,4801,5757,2127,3666,3271, # 5248
- 433,1895,2064,2076,5758, 602,2750,5759,5760,5761,5762,5763,3032,1628,3437,5764, # 5264
-3197,4802,4156,2904,4803,2519,5765,2551,2782,5766,5767,5768,3343,4804,2905,5769, # 5280
-4805,5770,2864,4806,4807,1221,2982,4157,2520,5771,5772,5773,1868,1990,5774,5775, # 5296
-5776,1896,5777,5778,4808,1897,4158, 318,5779,2095,4159,4437,5780,5781, 485,5782, # 5312
- 938,3941, 553,2680, 116,5783,3942,3667,5784,3545,2681,2783,3438,3344,2820,5785, # 5328
-3668,2943,4160,1747,2944,2983,5786,5787, 207,5788,4809,5789,4810,2521,5790,3033, # 5344
- 890,3669,3943,5791,1878,3798,3439,5792,2186,2358,3440,1652,5793,5794,5795, 941, # 5360
-2299, 208,3546,4161,2020, 330,4438,3944,2906,2499,3799,4439,4811,5796,5797,5798, # 5376
-)
-
diff --git a/lib/sub_repos/chardet/chardet/big5prober.py b/lib/sub_repos/chardet/chardet/big5prober.py
deleted file mode 100644
index 98f997012..000000000
--- a/lib/sub_repos/chardet/chardet/big5prober.py
+++ /dev/null
@@ -1,47 +0,0 @@
-######################## BEGIN LICENSE BLOCK ########################
-# The Original Code is Mozilla Communicator client code.
-#
-# The Initial Developer of the Original Code is
-# Netscape Communications Corporation.
-# Portions created by the Initial Developer are Copyright (C) 1998
-# the Initial Developer. All Rights Reserved.
-#
-# Contributor(s):
-#   Mark Pilgrim - port to Python
-#
-# This library is free software; you can redistribute it and/or
-# modify it under the terms of the GNU Lesser General Public
-# License as published by the Free Software Foundation; either
-# version 2.1 of the License, or (at your option) any later version.
-#
-# This library is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-# Lesser General Public License for more details.
-#
-# You should have received a copy of the GNU Lesser General Public
-# License along with this library; if not, write to the Free Software
-# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
-# 02110-1301  USA
-######################### END LICENSE BLOCK #########################
-
-from .mbcharsetprober import MultiByteCharSetProber
-from .codingstatemachine import CodingStateMachine
-from .chardistribution import Big5DistributionAnalysis
-from .mbcssm import BIG5_SM_MODEL
-
-
-class Big5Prober(MultiByteCharSetProber):
-    def __init__(self):
-        super(Big5Prober, self).__init__()
-        self.coding_sm = CodingStateMachine(BIG5_SM_MODEL)
-        self.distribution_analyzer = Big5DistributionAnalysis()
-        self.reset()
-
-    @property
-    def charset_name(self):
-        return "Big5"
-
-    @property
-    def language(self):
-        return "Chinese"
diff --git a/lib/sub_repos/chardet/chardet/chardistribution.py b/lib/sub_repos/chardet/chardet/chardistribution.py
deleted file mode 100644
index c0395f4a4..000000000
--- a/lib/sub_repos/chardet/chardet/chardistribution.py
+++ /dev/null
@@ -1,233 +0,0 @@
-######################## BEGIN LICENSE BLOCK ########################
-# The Original Code is Mozilla Communicator client code.
-#
-# The Initial Developer of the Original Code is
-# Netscape Communications Corporation.
-# Portions created by the Initial Developer are Copyright (C) 1998
-# the Initial Developer. All Rights Reserved.
-#
-# Contributor(s):
-#   Mark Pilgrim - port to Python
-#
-# This library is free software; you can redistribute it and/or
-# modify it under the terms of the GNU Lesser General Public
-# License as published by the Free Software Foundation; either
-# version 2.1 of the License, or (at your option) any later version.
-#
-# This library is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-# Lesser General Public License for more details.
-#
-# You should have received a copy of the GNU Lesser General Public
-# License along with this library; if not, write to the Free Software
-# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
-# 02110-1301  USA
-######################### END LICENSE BLOCK #########################
-
-from .euctwfreq import (EUCTW_CHAR_TO_FREQ_ORDER, EUCTW_TABLE_SIZE,
-                        EUCTW_TYPICAL_DISTRIBUTION_RATIO)
-from .euckrfreq import (EUCKR_CHAR_TO_FREQ_ORDER, EUCKR_TABLE_SIZE,
-                        EUCKR_TYPICAL_DISTRIBUTION_RATIO)
-from .gb2312freq import (GB2312_CHAR_TO_FREQ_ORDER, GB2312_TABLE_SIZE,
-                         GB2312_TYPICAL_DISTRIBUTION_RATIO)
-from .big5freq import (BIG5_CHAR_TO_FREQ_ORDER, BIG5_TABLE_SIZE,
-                       BIG5_TYPICAL_DISTRIBUTION_RATIO)
-from .jisfreq import (JIS_CHAR_TO_FREQ_ORDER, JIS_TABLE_SIZE,
-                      JIS_TYPICAL_DISTRIBUTION_RATIO)
-
-
-class CharDistributionAnalysis(object):
-    ENOUGH_DATA_THRESHOLD = 1024
-    SURE_YES = 0.99
-    SURE_NO = 0.01
-    MINIMUM_DATA_THRESHOLD = 3
-
-    def __init__(self):
-        # Mapping table to get frequency order from char order (get from
-        # GetOrder())
-        self._char_to_freq_order = None
-        self._table_size = None  # Size of above table
-        # This is a constant value which varies from language to language,
-        # used in calculating confidence.  See
-        # http://www.mozilla.org/projects/intl/UniversalCharsetDetection.html
-        # for further detail.
-        self.typical_distribution_ratio = None
-        self._done = None
-        self._total_chars = None
-        self._freq_chars = None
-        self.reset()
-
-    def reset(self):
-        """reset analyser, clear any state"""
-        # If this flag is set to True, detection is done and conclusion has
-        # been made
-        self._done = False
-        self._total_chars = 0  # Total characters encountered
-        # The number of characters whose frequency order is less than 512
-        self._freq_chars = 0
-
-    def feed(self, char, char_len):
-        """feed a character with known length"""
-        if char_len == 2:
-            # we only care about 2-bytes character in our distribution analysis
-            order = self.get_order(char)
-        else:
-            order = -1
-        if order >= 0:
-            self._total_chars += 1
-            # order is valid
-            if order < self._table_size:
-                if 512 > self._char_to_freq_order[order]:
-                    self._freq_chars += 1
-
-    def get_confidence(self):
-        """return confidence based on existing data"""
-        # if we didn't receive any character in our consideration range,
-        # return negative answer
-        if self._total_chars <= 0 or self._freq_chars <= self.MINIMUM_DATA_THRESHOLD:
-            return self.SURE_NO
-
-        if self._total_chars != self._freq_chars:
-            r = (self._freq_chars / ((self._total_chars - self._freq_chars)
-                 * self.typical_distribution_ratio))
-            if r < self.SURE_YES:
-                return r
-
-        # normalize confidence (we don't want to be 100% sure)
-        return self.SURE_YES
-
-    def got_enough_data(self):
-        # It is not necessary to receive all data to draw conclusion.
-        # For charset detection, certain amount of data is enough
-        return self._total_chars > self.ENOUGH_DATA_THRESHOLD
-
-    def get_order(self, byte_str):
-        # We do not handle characters based on the original encoding string,
-        # but convert this encoding string to a number, here called order.
-        # This allows multiple encodings of a language to share one frequency
-        # table.
-        return -1
-
-
-class EUCTWDistributionAnalysis(CharDistributionAnalysis):
-    def __init__(self):
-        super(EUCTWDistributionAnalysis, self).__init__()
-        self._char_to_freq_order = EUCTW_CHAR_TO_FREQ_ORDER
-        self._table_size = EUCTW_TABLE_SIZE
-        self.typical_distribution_ratio = EUCTW_TYPICAL_DISTRIBUTION_RATIO
-
-    def get_order(self, byte_str):
-        # for euc-TW encoding, we are interested
-        #   first  byte range: 0xc4 -- 0xfe
-        #   second byte range: 0xa1 -- 0xfe
-        # no validation needed here. State machine has done that
-        first_char = byte_str[0]
-        if first_char >= 0xC4:
-            return 94 * (first_char - 0xC4) + byte_str[1] - 0xA1
-        else:
-            return -1
-
-
-class EUCKRDistributionAnalysis(CharDistributionAnalysis):
-    def __init__(self):
-        super(EUCKRDistributionAnalysis, self).__init__()
-        self._char_to_freq_order = EUCKR_CHAR_TO_FREQ_ORDER
-        self._table_size = EUCKR_TABLE_SIZE
-        self.typical_distribution_ratio = EUCKR_TYPICAL_DISTRIBUTION_RATIO
-
-    def get_order(self, byte_str):
-        # for euc-KR encoding, we are interested
-        #   first  byte range: 0xb0 -- 0xfe
-        #   second byte range: 0xa1 -- 0xfe
-        # no validation needed here. State machine has done that
-        first_char = byte_str[0]
-        if first_char >= 0xB0:
-            return 94 * (first_char - 0xB0) + byte_str[1] - 0xA1
-        else:
-            return -1
-
-
-class GB2312DistributionAnalysis(CharDistributionAnalysis):
-    def __init__(self):
-        super(GB2312DistributionAnalysis, self).__init__()
-        self._char_to_freq_order = GB2312_CHAR_TO_FREQ_ORDER
-        self._table_size = GB2312_TABLE_SIZE
-        self.typical_distribution_ratio = GB2312_TYPICAL_DISTRIBUTION_RATIO
-
-    def get_order(self, byte_str):
-        # for GB2312 encoding, we are interested
-        #  first  byte range: 0xb0 -- 0xfe
-        #  second byte range: 0xa1 -- 0xfe
-        # no validation needed here. State machine has done that
-        first_char, second_char = byte_str[0], byte_str[1]
-        if (first_char >= 0xB0) and (second_char >= 0xA1):
-            return 94 * (first_char - 0xB0) + second_char - 0xA1
-        else:
-            return -1
-
-
-class Big5DistributionAnalysis(CharDistributionAnalysis):
-    def __init__(self):
-        super(Big5DistributionAnalysis, self).__init__()
-        self._char_to_freq_order = BIG5_CHAR_TO_FREQ_ORDER
-        self._table_size = BIG5_TABLE_SIZE
-        self.typical_distribution_ratio = BIG5_TYPICAL_DISTRIBUTION_RATIO
-
-    def get_order(self, byte_str):
-        # for big5 encoding, we are interested
-        #   first  byte range: 0xa4 -- 0xfe
-        #   second byte range: 0x40 -- 0x7e , 0xa1 -- 0xfe
-        # no validation needed here. State machine has done that
-        first_char, second_char = byte_str[0], byte_str[1]
-        if first_char >= 0xA4:
-            if second_char >= 0xA1:
-                return 157 * (first_char - 0xA4) + second_char - 0xA1 + 63
-            else:
-                return 157 * (first_char - 0xA4) + second_char - 0x40
-        else:
-            return -1
-
-
-class SJISDistributionAnalysis(CharDistributionAnalysis):
-    def __init__(self):
-        super(SJISDistributionAnalysis, self).__init__()
-        self._char_to_freq_order = JIS_CHAR_TO_FREQ_ORDER
-        self._table_size = JIS_TABLE_SIZE
-        self.typical_distribution_ratio = JIS_TYPICAL_DISTRIBUTION_RATIO
-
-    def get_order(self, byte_str):
-        # for sjis encoding, we are interested
-        #   first  byte range: 0x81 -- 0x9f , 0xe0 -- 0xfe
-        #   second byte range: 0x40 -- 0x7e,  0x81 -- oxfe
-        # no validation needed here. State machine has done that
-        first_char, second_char = byte_str[0], byte_str[1]
-        if (first_char >= 0x81) and (first_char <= 0x9F):
-            order = 188 * (first_char - 0x81)
-        elif (first_char >= 0xE0) and (first_char <= 0xEF):
-            order = 188 * (first_char - 0xE0 + 31)
-        else:
-            return -1
-        order = order + second_char - 0x40
-        if second_char > 0x7F:
-            order = -1
-        return order
-
-
-class EUCJPDistributionAnalysis(CharDistributionAnalysis):
-    def __init__(self):
-        super(EUCJPDistributionAnalysis, self).__init__()
-        self._char_to_freq_order = JIS_CHAR_TO_FREQ_ORDER
-        self._table_size = JIS_TABLE_SIZE
-        self.typical_distribution_ratio = JIS_TYPICAL_DISTRIBUTION_RATIO
-
-    def get_order(self, byte_str):
-        # for euc-JP encoding, we are interested
-        #   first  byte range: 0xa0 -- 0xfe
-        #   second byte range: 0xa1 -- 0xfe
-        # no validation needed here. State machine has done that
-        char = byte_str[0]
-        if char >= 0xA0:
-            return 94 * (char - 0xA1) + byte_str[1] - 0xa1
-        else:
-            return -1
diff --git a/lib/sub_repos/chardet/chardet/charsetgroupprober.py b/lib/sub_repos/chardet/chardet/charsetgroupprober.py
deleted file mode 100644
index 5812cef0b..000000000
--- a/lib/sub_repos/chardet/chardet/charsetgroupprober.py
+++ /dev/null
@@ -1,107 +0,0 @@
-######################## BEGIN LICENSE BLOCK ########################
-# The Original Code is Mozilla Communicator client code.
-#
-# The Initial Developer of the Original Code is
-# Netscape Communications Corporation.
-# Portions created by the Initial Developer are Copyright (C) 1998
-# the Initial Developer. All Rights Reserved.
-#
-# Contributor(s):
-#   Mark Pilgrim - port to Python
-#
-# This library is free software; you can redistribute it and/or
-# modify it under the terms of the GNU Lesser General Public
-# License as published by the Free Software Foundation; either
-# version 2.1 of the License, or (at your option) any later version.
-#
-# This library is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-# Lesser General Public License for more details.
-#
-# You should have received a copy of the GNU Lesser General Public
-# License along with this library; if not, write to the Free Software
-# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
-# 02110-1301  USA
-######################### END LICENSE BLOCK #########################
-
-from .enums import ProbingState
-from .charsetprober import CharSetProber
-
-
-class CharSetGroupProber(CharSetProber):
-    def __init__(self, lang_filter=None):
-        super(CharSetGroupProber, self).__init__(lang_filter=lang_filter)
-        self._active_num = 0
-        self.probers = []
-        self._best_guess_prober = None
-
-    def reset(self):
-        super(CharSetGroupProber, self).reset()
-        self._active_num = 0
-        for prober in self.probers:
-            if prober:
-                prober.reset()
-                prober.active = True
-                self._active_num += 1
-        self._best_guess_prober = None
-
-    @property
-    def charset_name(self):
-        if not self._best_guess_prober:
-            self.get_confidence()
-            if not self._best_guess_prober:
-                return None
-        return self._best_guess_prober.charset_name
-
-    @property
-    def language(self):
-        if not self._best_guess_prober:
-            self.get_confidence()
-            if not self._best_guess_prober:
-                return None
-        return self._best_guess_prober.language
-
-    def feed(self, byte_str):
-        for prober in self.probers:
-            if not prober:
-                continue
-            if not prober.active:
-                continue
-            state = prober.feed(byte_str)
-            if not state:
-                continue
-            if state == ProbingState.FOUND_IT:
-                self._best_guess_prober = prober
-                self._state = ProbingState.FOUND_IT
-                return self.state
-            elif state == ProbingState.NOT_ME:
-                prober.active = False
-                self._active_num -= 1
-                if self._active_num <= 0:
-                    self._state = ProbingState.NOT_ME
-                    return self.state
-        return self.state
-
-    def get_confidence(self):
-        state = self.state
-        if state == ProbingState.FOUND_IT:
-            return 0.99
-        elif state == ProbingState.NOT_ME:
-            return 0.01
-        best_conf = 0.0
-        self._best_guess_prober = None
-        for prober in self.probers:
-            if not prober:
-                continue
-            if not prober.active:
-                self.logger.debug('%s not active', prober.charset_name)
-                continue
-            conf = prober.get_confidence()
-            self.logger.debug('%s %s confidence = %s', prober.charset_name, prober.language, conf)
-            if best_conf < conf:
-                best_conf = conf
-                self._best_guess_prober = prober
-        if not self._best_guess_prober:
-            return 0.0
-        return best_conf
diff --git a/lib/sub_repos/chardet/chardet/charsetprober.py b/lib/sub_repos/chardet/chardet/charsetprober.py
deleted file mode 100644
index eac4e5986..000000000
--- a/lib/sub_repos/chardet/chardet/charsetprober.py
+++ /dev/null
@@ -1,145 +0,0 @@
-######################## BEGIN LICENSE BLOCK ########################
-# The Original Code is Mozilla Universal charset detector code.
-#
-# The Initial Developer of the Original Code is
-# Netscape Communications Corporation.
-# Portions created by the Initial Developer are Copyright (C) 2001
-# the Initial Developer. All Rights Reserved.
-#
-# Contributor(s):
-#   Mark Pilgrim - port to Python
-#   Shy Shalom - original C code
-#
-# This library is free software; you can redistribute it and/or
-# modify it under the terms of the GNU Lesser General Public
-# License as published by the Free Software Foundation; either
-# version 2.1 of the License, or (at your option) any later version.
-#
-# This library is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-# Lesser General Public License for more details.
-#
-# You should have received a copy of the GNU Lesser General Public
-# License along with this library; if not, write to the Free Software
-# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
-# 02110-1301  USA
-######################### END LICENSE BLOCK #########################
-
-import logging
-import re
-
-from .enums import ProbingState
-
-
-class CharSetProber(object):
-
-    SHORTCUT_THRESHOLD = 0.95
-
-    def __init__(self, lang_filter=None):
-        self._state = None
-        self.lang_filter = lang_filter
-        self.logger = logging.getLogger(__name__)
-
-    def reset(self):
-        self._state = ProbingState.DETECTING
-
-    @property
-    def charset_name(self):
-        return None
-
-    def feed(self, buf):
-        pass
-
-    @property
-    def state(self):
-        return self._state
-
-    def get_confidence(self):
-        return 0.0
-
-    @staticmethod
-    def filter_high_byte_only(buf):
-        buf = re.sub(b'([\x00-\x7F])+', b' ', buf)
-        return buf
-
-    @staticmethod
-    def filter_international_words(buf):
-        """
-        We define three types of bytes:
-        alphabet: english alphabets [a-zA-Z]
-        international: international characters [\x80-\xFF]
-        marker: everything else [^a-zA-Z\x80-\xFF]
-
-        The input buffer can be thought to contain a series of words delimited
-        by markers. This function works to filter all words that contain at
-        least one international character. All contiguous sequences of markers
-        are replaced by a single space ascii character.
-
-        This filter applies to all scripts which do not use English characters.
-        """
-        filtered = bytearray()
-
-        # This regex expression filters out only words that have at-least one
-        # international character. The word may include one marker character at
-        # the end.
-        words = re.findall(b'[a-zA-Z]*[\x80-\xFF]+[a-zA-Z]*[^a-zA-Z\x80-\xFF]?',
-                           buf)
-
-        for word in words:
-            filtered.extend(word[:-1])
-
-            # If the last character in the word is a marker, replace it with a
-            # space as markers shouldn't affect our analysis (they are used
-            # similarly across all languages and may thus have similar
-            # frequencies).
-            last_char = word[-1:]
-            if not last_char.isalpha() and last_char < b'\x80':
-                last_char = b' '
-            filtered.extend(last_char)
-
-        return filtered
-
-    @staticmethod
-    def filter_with_english_letters(buf):
-        """
-        Returns a copy of ``buf`` that retains only the sequences of English
-        alphabet and high byte characters that are not between <> characters.
-        Also retains English alphabet and high byte characters immediately
-        before occurrences of >.
-
-        This filter can be applied to all scripts which contain both English
-        characters and extended ASCII characters, but is currently only used by
-        ``Latin1Prober``.
-        """
-        filtered = bytearray()
-        in_tag = False
-        prev = 0
-
-        for curr in range(len(buf)):
-            # Slice here to get bytes instead of an int with Python 3
-            buf_char = buf[curr:curr + 1]
-            # Check if we're coming out of or entering an HTML tag
-            if buf_char == b'>':
-                in_tag = False
-            elif buf_char == b'<':
-                in_tag = True
-
-            # If current character is not extended-ASCII and not alphabetic...
-            if buf_char < b'\x80' and not buf_char.isalpha():
-                # ...and we're not in a tag
-                if curr > prev and not in_tag:
-                    # Keep everything after last non-extended-ASCII,
-                    # non-alphabetic character
-                    filtered.extend(buf[prev:curr])
-                    # Output a space to delimit stretch we kept
-                    filtered.extend(b' ')
-                prev = curr + 1
-
-        # If we're not in a tag...
-        if not in_tag:
-            # Keep everything after last non-extended-ASCII, non-alphabetic
-            # character
-            filtered.extend(buf[prev:])
-
-        return filtered
diff --git a/lib/sub_repos/chardet/chardet/cli/__init__.py b/lib/sub_repos/chardet/chardet/cli/__init__.py
deleted file mode 100644
index 8b1378917..000000000
--- a/lib/sub_repos/chardet/chardet/cli/__init__.py
+++ /dev/null
@@ -1 +0,0 @@
-
diff --git a/lib/sub_repos/chardet/chardet/cli/chardetect.py b/lib/sub_repos/chardet/chardet/cli/chardetect.py
deleted file mode 100644
index e1d8cd69a..000000000
--- a/lib/sub_repos/chardet/chardet/cli/chardetect.py
+++ /dev/null
@@ -1,84 +0,0 @@
-"""
-Script which takes one or more file paths and reports on their detected
-encodings
-
-Example::
-
-    % chardetect somefile someotherfile
-    somefile: windows-1252 with confidence 0.5
-    someotherfile: ascii with confidence 1.0
-
-If no paths are provided, it takes its input from stdin.
-
-"""
-
-from __future__ import absolute_import, print_function, unicode_literals
-
-import argparse
-import sys
-
-from chardet import __version__
-from chardet.compat import PY2
-from chardet.universaldetector import UniversalDetector
-
-
-def description_of(lines, name='stdin'):
-    """
-    Return a string describing the probable encoding of a file or
-    list of strings.
-
-    :param lines: The lines to get the encoding of.
-    :type lines: Iterable of bytes
-    :param name: Name of file or collection of lines
-    :type name: str
-    """
-    u = UniversalDetector()
-    for line in lines:
-        line = bytearray(line)
-        u.feed(line)
-        # shortcut out of the loop to save reading further - particularly useful if we read a BOM.
-        if u.done:
-            break
-    u.close()
-    result = u.result
-    if PY2:
-        name = name.decode(sys.getfilesystemencoding(), 'ignore')
-    if result['encoding']:
-        return '{}: {} with confidence {}'.format(name, result['encoding'],
-                                                     result['confidence'])
-    else:
-        return '{}: no result'.format(name)
-
-
-def main(argv=None):
-    """
-    Handles command line arguments and gets things started.
-
-    :param argv: List of arguments, as if specified on the command-line.
-                 If None, ``sys.argv[1:]`` is used instead.
-    :type argv: list of str
-    """
-    # Get command line arguments
-    parser = argparse.ArgumentParser(
-        description="Takes one or more file paths and reports their detected \
-                     encodings")
-    parser.add_argument('input',
-                        help='File whose encoding we would like to determine. \
-                              (default: stdin)',
-                        type=argparse.FileType('rb'), nargs='*',
-                        default=[sys.stdin if PY2 else sys.stdin.buffer])
-    parser.add_argument('--version', action='version',
-                        version='%(prog)s {}'.format(__version__))
-    args = parser.parse_args(argv)
-
-    for f in args.input:
-        if f.isatty():
-            print("You are running chardetect interactively. Press " +
-                  "CTRL-D twice at the start of a blank line to signal the " +
-                  "end of your input. If you want help, run chardetect " +
-                  "--help\n", file=sys.stderr)
-        print(description_of(f, f.name))
-
-
-if __name__ == '__main__':
-    main()
diff --git a/lib/sub_repos/chardet/chardet/codingstatemachine.py b/lib/sub_repos/chardet/chardet/codingstatemachine.py
deleted file mode 100644
index 68fba44f1..000000000
--- a/lib/sub_repos/chardet/chardet/codingstatemachine.py
+++ /dev/null
@@ -1,88 +0,0 @@
-######################## BEGIN LICENSE BLOCK ########################
-# The Original Code is mozilla.org code.
-#
-# The Initial Developer of the Original Code is
-# Netscape Communications Corporation.
-# Portions created by the Initial Developer are Copyright (C) 1998
-# the Initial Developer. All Rights Reserved.
-#
-# Contributor(s):
-#   Mark Pilgrim - port to Python
-#
-# This library is free software; you can redistribute it and/or
-# modify it under the terms of the GNU Lesser General Public
-# License as published by the Free Software Foundation; either
-# version 2.1 of the License, or (at your option) any later version.
-#
-# This library is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-# Lesser General Public License for more details.
-#
-# You should have received a copy of the GNU Lesser General Public
-# License along with this library; if not, write to the Free Software
-# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
-# 02110-1301  USA
-######################### END LICENSE BLOCK #########################
-
-import logging
-
-from .enums import MachineState
-
-
-class CodingStateMachine(object):
-    """
-    A state machine to verify a byte sequence for a particular encoding. For
-    each byte the detector receives, it will feed that byte to every active
-    state machine available, one byte at a time. The state machine changes its
-    state based on its previous state and the byte it receives. There are 3
-    states in a state machine that are of interest to an auto-detector:
-
-    START state: This is the state to start with, or a legal byte sequence
-                 (i.e. a valid code point) for character has been identified.
-
-    ME state:  This indicates that the state machine identified a byte sequence
-               that is specific to the charset it is designed for and that
-               there is no other possible encoding which can contain this byte
-               sequence. This will to lead to an immediate positive answer for
-               the detector.
-
-    ERROR state: This indicates the state machine identified an illegal byte
-                 sequence for that encoding. This will lead to an immediate
-                 negative answer for this encoding. Detector will exclude this
-                 encoding from consideration from here on.
-    """
-    def __init__(self, sm):
-        self._model = sm
-        self._curr_byte_pos = 0
-        self._curr_char_len = 0
-        self._curr_state = None
-        self.logger = logging.getLogger(__name__)
-        self.reset()
-
-    def reset(self):
-        self._curr_state = MachineState.START
-
-    def next_state(self, c):
-        # for each byte we get its class
-        # if it is first byte, we also get byte length
-        byte_class = self._model['class_table'][c]
-        if self._curr_state == MachineState.START:
-            self._curr_byte_pos = 0
-            self._curr_char_len = self._model['char_len_table'][byte_class]
-        # from byte's class and state_table, we get its next state
-        curr_state = (self._curr_state * self._model['class_factor']
-                      + byte_class)
-        self._curr_state = self._model['state_table'][curr_state]
-        self._curr_byte_pos += 1
-        return self._curr_state
-
-    def get_current_charlen(self):
-        return self._curr_char_len
-
-    def get_coding_state_machine(self):
-        return self._model['name']
-
-    @property
-    def language(self):
-        return self._model['language']
diff --git a/lib/sub_repos/chardet/chardet/compat.py b/lib/sub_repos/chardet/chardet/compat.py
deleted file mode 100644
index 8941572b3..000000000
--- a/lib/sub_repos/chardet/chardet/compat.py
+++ /dev/null
@@ -1,36 +0,0 @@
-######################## BEGIN LICENSE BLOCK ########################
-# Contributor(s):
-#   Dan Blanchard
-#   Ian Cordasco
-#
-# This library is free software; you can redistribute it and/or
-# modify it under the terms of the GNU Lesser General Public
-# License as published by the Free Software Foundation; either
-# version 2.1 of the License, or (at your option) any later version.
-#
-# This library is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-# Lesser General Public License for more details.
-#
-# You should have received a copy of the GNU Lesser General Public
-# License along with this library; if not, write to the Free Software
-# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
-# 02110-1301  USA
-######################### END LICENSE BLOCK #########################
-
-import sys
-
-
-if sys.version_info < (3, 0):
-    PY2 = True
-    PY3 = False
-    string_types = (str, unicode)
-    text_type = unicode
-    iteritems = dict.iteritems
-else:
-    PY2 = False
-    PY3 = True
-    string_types = (bytes, str)
-    text_type = str
-    iteritems = dict.items
diff --git a/lib/sub_repos/chardet/chardet/cp949prober.py b/lib/sub_repos/chardet/chardet/cp949prober.py
deleted file mode 100644
index efd793abc..000000000
--- a/lib/sub_repos/chardet/chardet/cp949prober.py
+++ /dev/null
@@ -1,49 +0,0 @@
-######################## BEGIN LICENSE BLOCK ########################
-# The Original Code is mozilla.org code.
-#
-# The Initial Developer of the Original Code is
-# Netscape Communications Corporation.
-# Portions created by the Initial Developer are Copyright (C) 1998
-# the Initial Developer. All Rights Reserved.
-#
-# Contributor(s):
-#   Mark Pilgrim - port to Python
-#
-# This library is free software; you can redistribute it and/or
-# modify it under the terms of the GNU Lesser General Public
-# License as published by the Free Software Foundation; either
-# version 2.1 of the License, or (at your option) any later version.
-#
-# This library is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-# Lesser General Public License for more details.
-#
-# You should have received a copy of the GNU Lesser General Public
-# License along with this library; if not, write to the Free Software
-# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
-# 02110-1301  USA
-######################### END LICENSE BLOCK #########################
-
-from .chardistribution import EUCKRDistributionAnalysis
-from .codingstatemachine import CodingStateMachine
-from .mbcharsetprober import MultiByteCharSetProber
-from .mbcssm import CP949_SM_MODEL
-
-
-class CP949Prober(MultiByteCharSetProber):
-    def __init__(self):
-        super(CP949Prober, self).__init__()
-        self.coding_sm = CodingStateMachine(CP949_SM_MODEL)
-        # NOTE: CP949 is a superset of EUC-KR, so the distribution should be
-        #       not different.
-        self.distribution_analyzer = EUCKRDistributionAnalysis()
-        self.reset()
-
-    @property
-    def charset_name(self):
-        return "CP949"
-
-    @property
-    def language(self):
-        return "Korean"
diff --git a/lib/sub_repos/chardet/chardet/enums.py b/lib/sub_repos/chardet/chardet/enums.py
deleted file mode 100644
index 045120722..000000000
--- a/lib/sub_repos/chardet/chardet/enums.py
+++ /dev/null
@@ -1,76 +0,0 @@
-"""
-All of the Enums that are used throughout the chardet package.
-
-:author: Dan Blanchard (dan.blanchard@gmail.com)
-"""
-
-
-class InputState(object):
-    """
-    This enum represents the different states a universal detector can be in.
-    """
-    PURE_ASCII = 0
-    ESC_ASCII = 1
-    HIGH_BYTE = 2
-
-
-class LanguageFilter(object):
-    """
-    This enum represents the different language filters we can apply to a
-    ``UniversalDetector``.
-    """
-    CHINESE_SIMPLIFIED = 0x01
-    CHINESE_TRADITIONAL = 0x02
-    JAPANESE = 0x04
-    KOREAN = 0x08
-    NON_CJK = 0x10
-    ALL = 0x1F
-    CHINESE = CHINESE_SIMPLIFIED | CHINESE_TRADITIONAL
-    CJK = CHINESE | JAPANESE | KOREAN
-
-
-class ProbingState(object):
-    """
-    This enum represents the different states a prober can be in.
-    """
-    DETECTING = 0
-    FOUND_IT = 1
-    NOT_ME = 2
-
-
-class MachineState(object):
-    """
-    This enum represents the different states a state machine can be in.
-    """
-    START = 0
-    ERROR = 1
-    ITS_ME = 2
-
-
-class SequenceLikelihood(object):
-    """
-    This enum represents the likelihood of a character following the previous one.
-    """
-    NEGATIVE = 0
-    UNLIKELY = 1
-    LIKELY = 2
-    POSITIVE = 3
-
-    @classmethod
-    def get_num_categories(cls):
-        """:returns: The number of likelihood categories in the enum."""
-        return 4
-
-
-class CharacterCategory(object):
-    """
-    This enum represents the different categories language models for
-    ``SingleByteCharsetProber`` put characters into.
-
-    Anything less than CONTROL is considered a letter.
-    """
-    UNDEFINED = 255
-    LINE_BREAK = 254
-    SYMBOL = 253
-    DIGIT = 252
-    CONTROL = 251
diff --git a/lib/sub_repos/chardet/chardet/escprober.py b/lib/sub_repos/chardet/chardet/escprober.py
deleted file mode 100644
index c70493f2b..000000000
--- a/lib/sub_repos/chardet/chardet/escprober.py
+++ /dev/null
@@ -1,101 +0,0 @@
-######################## BEGIN LICENSE BLOCK ########################
-# The Original Code is mozilla.org code.
-#
-# The Initial Developer of the Original Code is
-# Netscape Communications Corporation.
-# Portions created by the Initial Developer are Copyright (C) 1998
-# the Initial Developer. All Rights Reserved.
-#
-# Contributor(s):
-#   Mark Pilgrim - port to Python
-#
-# This library is free software; you can redistribute it and/or
-# modify it under the terms of the GNU Lesser General Public
-# License as published by the Free Software Foundation; either
-# version 2.1 of the License, or (at your option) any later version.
-#
-# This library is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-# Lesser General Public License for more details.
-#
-# You should have received a copy of the GNU Lesser General Public
-# License along with this library; if not, write to the Free Software
-# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
-# 02110-1301  USA
-######################### END LICENSE BLOCK #########################
-
-from .charsetprober import CharSetProber
-from .codingstatemachine import CodingStateMachine
-from .enums import LanguageFilter, ProbingState, MachineState
-from .escsm import (HZ_SM_MODEL, ISO2022CN_SM_MODEL, ISO2022JP_SM_MODEL,
-                    ISO2022KR_SM_MODEL)
-
-
-class EscCharSetProber(CharSetProber):
-    """
-    This CharSetProber uses a "code scheme" approach for detecting encodings,
-    whereby easily recognizable escape or shift sequences are relied on to
-    identify these encodings.
-    """
-
-    def __init__(self, lang_filter=None):
-        super(EscCharSetProber, self).__init__(lang_filter=lang_filter)
-        self.coding_sm = []
-        if self.lang_filter & LanguageFilter.CHINESE_SIMPLIFIED:
-            self.coding_sm.append(CodingStateMachine(HZ_SM_MODEL))
-            self.coding_sm.append(CodingStateMachine(ISO2022CN_SM_MODEL))
-        if self.lang_filter & LanguageFilter.JAPANESE:
-            self.coding_sm.append(CodingStateMachine(ISO2022JP_SM_MODEL))
-        if self.lang_filter & LanguageFilter.KOREAN:
-            self.coding_sm.append(CodingStateMachine(ISO2022KR_SM_MODEL))
-        self.active_sm_count = None
-        self._detected_charset = None
-        self._detected_language = None
-        self._state = None
-        self.reset()
-
-    def reset(self):
-        super(EscCharSetProber, self).reset()
-        for coding_sm in self.coding_sm:
-            if not coding_sm:
-                continue
-            coding_sm.active = True
-            coding_sm.reset()
-        self.active_sm_count = len(self.coding_sm)
-        self._detected_charset = None
-        self._detected_language = None
-
-    @property
-    def charset_name(self):
-        return self._detected_charset
-
-    @property
-    def language(self):
-        return self._detected_language
-
-    def get_confidence(self):
-        if self._detected_charset:
-            return 0.99
-        else:
-            return 0.00
-
-    def feed(self, byte_str):
-        for c in byte_str:
-            for coding_sm in self.coding_sm:
-                if not coding_sm or not coding_sm.active:
-                    continue
-                coding_state = coding_sm.next_state(c)
-                if coding_state == MachineState.ERROR:
-                    coding_sm.active = False
-                    self.active_sm_count -= 1
-                    if self.active_sm_count <= 0:
-                        self._state = ProbingState.NOT_ME
-                        return self.state
-                elif coding_state == MachineState.ITS_ME:
-                    self._state = ProbingState.FOUND_IT
-                    self._detected_charset = coding_sm.get_coding_state_machine()
-                    self._detected_language = coding_sm.language
-                    return self.state
-
-        return self.state
diff --git a/lib/sub_repos/chardet/chardet/escsm.py b/lib/sub_repos/chardet/chardet/escsm.py
deleted file mode 100644
index 0069523a0..000000000
--- a/lib/sub_repos/chardet/chardet/escsm.py
+++ /dev/null
@@ -1,246 +0,0 @@
-######################## BEGIN LICENSE BLOCK ########################
-# The Original Code is mozilla.org code.
-#
-# The Initial Developer of the Original Code is
-# Netscape Communications Corporation.
-# Portions created by the Initial Developer are Copyright (C) 1998
-# the Initial Developer. All Rights Reserved.
-#
-# Contributor(s):
-#   Mark Pilgrim - port to Python
-#
-# This library is free software; you can redistribute it and/or
-# modify it under the terms of the GNU Lesser General Public
-# License as published by the Free Software Foundation; either
-# version 2.1 of the License, or (at your option) any later version.
-#
-# This library is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-# Lesser General Public License for more details.
-#
-# You should have received a copy of the GNU Lesser General Public
-# License along with this library; if not, write to the Free Software
-# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
-# 02110-1301  USA
-######################### END LICENSE BLOCK #########################
-
-from .enums import MachineState
-
-HZ_CLS = (
-1,0,0,0,0,0,0,0,  # 00 - 07
-0,0,0,0,0,0,0,0,  # 08 - 0f
-0,0,0,0,0,0,0,0,  # 10 - 17
-0,0,0,1,0,0,0,0,  # 18 - 1f
-0,0,0,0,0,0,0,0,  # 20 - 27
-0,0,0,0,0,0,0,0,  # 28 - 2f
-0,0,0,0,0,0,0,0,  # 30 - 37
-0,0,0,0,0,0,0,0,  # 38 - 3f
-0,0,0,0,0,0,0,0,  # 40 - 47
-0,0,0,0,0,0,0,0,  # 48 - 4f
-0,0,0,0,0,0,0,0,  # 50 - 57
-0,0,0,0,0,0,0,0,  # 58 - 5f
-0,0,0,0,0,0,0,0,  # 60 - 67
-0,0,0,0,0,0,0,0,  # 68 - 6f
-0,0,0,0,0,0,0,0,  # 70 - 77
-0,0,0,4,0,5,2,0,  # 78 - 7f
-1,1,1,1,1,1,1,1,  # 80 - 87
-1,1,1,1,1,1,1,1,  # 88 - 8f
-1,1,1,1,1,1,1,1,  # 90 - 97
-1,1,1,1,1,1,1,1,  # 98 - 9f
-1,1,1,1,1,1,1,1,  # a0 - a7
-1,1,1,1,1,1,1,1,  # a8 - af
-1,1,1,1,1,1,1,1,  # b0 - b7
-1,1,1,1,1,1,1,1,  # b8 - bf
-1,1,1,1,1,1,1,1,  # c0 - c7
-1,1,1,1,1,1,1,1,  # c8 - cf
-1,1,1,1,1,1,1,1,  # d0 - d7
-1,1,1,1,1,1,1,1,  # d8 - df
-1,1,1,1,1,1,1,1,  # e0 - e7
-1,1,1,1,1,1,1,1,  # e8 - ef
-1,1,1,1,1,1,1,1,  # f0 - f7
-1,1,1,1,1,1,1,1,  # f8 - ff
-)
-
-HZ_ST = (
-MachineState.START,MachineState.ERROR,     3,MachineState.START,MachineState.START,MachineState.START,MachineState.ERROR,MachineState.ERROR,# 00-07
-MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,# 08-0f
-MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ERROR,MachineState.ERROR,MachineState.START,MachineState.START,     4,MachineState.ERROR,# 10-17
-     5,MachineState.ERROR,     6,MachineState.ERROR,     5,     5,     4,MachineState.ERROR,# 18-1f
-     4,MachineState.ERROR,     4,     4,     4,MachineState.ERROR,     4,MachineState.ERROR,# 20-27
-     4,MachineState.ITS_ME,MachineState.START,MachineState.START,MachineState.START,MachineState.START,MachineState.START,MachineState.START,# 28-2f
-)
-
-HZ_CHAR_LEN_TABLE = (0, 0, 0, 0, 0, 0)
-
-HZ_SM_MODEL = {'class_table': HZ_CLS,
-               'class_factor': 6,
-               'state_table': HZ_ST,
-               'char_len_table': HZ_CHAR_LEN_TABLE,
-               'name': "HZ-GB-2312",
-               'language': 'Chinese'}
-
-ISO2022CN_CLS = (
-2,0,0,0,0,0,0,0,  # 00 - 07
-0,0,0,0,0,0,0,0,  # 08 - 0f
-0,0,0,0,0,0,0,0,  # 10 - 17
-0,0,0,1,0,0,0,0,  # 18 - 1f
-0,0,0,0,0,0,0,0,  # 20 - 27
-0,3,0,0,0,0,0,0,  # 28 - 2f
-0,0,0,0,0,0,0,0,  # 30 - 37
-0,0,0,0,0,0,0,0,  # 38 - 3f
-0,0,0,4,0,0,0,0,  # 40 - 47
-0,0,0,0,0,0,0,0,  # 48 - 4f
-0,0,0,0,0,0,0,0,  # 50 - 57
-0,0,0,0,0,0,0,0,  # 58 - 5f
-0,0,0,0,0,0,0,0,  # 60 - 67
-0,0,0,0,0,0,0,0,  # 68 - 6f
-0,0,0,0,0,0,0,0,  # 70 - 77
-0,0,0,0,0,0,0,0,  # 78 - 7f
-2,2,2,2,2,2,2,2,  # 80 - 87
-2,2,2,2,2,2,2,2,  # 88 - 8f
-2,2,2,2,2,2,2,2,  # 90 - 97
-2,2,2,2,2,2,2,2,  # 98 - 9f
-2,2,2,2,2,2,2,2,  # a0 - a7
-2,2,2,2,2,2,2,2,  # a8 - af
-2,2,2,2,2,2,2,2,  # b0 - b7
-2,2,2,2,2,2,2,2,  # b8 - bf
-2,2,2,2,2,2,2,2,  # c0 - c7
-2,2,2,2,2,2,2,2,  # c8 - cf
-2,2,2,2,2,2,2,2,  # d0 - d7
-2,2,2,2,2,2,2,2,  # d8 - df
-2,2,2,2,2,2,2,2,  # e0 - e7
-2,2,2,2,2,2,2,2,  # e8 - ef
-2,2,2,2,2,2,2,2,  # f0 - f7
-2,2,2,2,2,2,2,2,  # f8 - ff
-)
-
-ISO2022CN_ST = (
-MachineState.START,     3,MachineState.ERROR,MachineState.START,MachineState.START,MachineState.START,MachineState.START,MachineState.START,# 00-07
-MachineState.START,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,# 08-0f
-MachineState.ERROR,MachineState.ERROR,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,# 10-17
-MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,     4,MachineState.ERROR,# 18-1f
-MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ITS_ME,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,# 20-27
-     5,     6,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,# 28-2f
-MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ITS_ME,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,# 30-37
-MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ITS_ME,MachineState.ERROR,MachineState.START,# 38-3f
-)
-
-ISO2022CN_CHAR_LEN_TABLE = (0, 0, 0, 0, 0, 0, 0, 0, 0)
-
-ISO2022CN_SM_MODEL = {'class_table': ISO2022CN_CLS,
-                      'class_factor': 9,
-                      'state_table': ISO2022CN_ST,
-                      'char_len_table': ISO2022CN_CHAR_LEN_TABLE,
-                      'name': "ISO-2022-CN",
-                      'language': 'Chinese'}
-
-ISO2022JP_CLS = (
-2,0,0,0,0,0,0,0,  # 00 - 07
-0,0,0,0,0,0,2,2,  # 08 - 0f
-0,0,0,0,0,0,0,0,  # 10 - 17
-0,0,0,1,0,0,0,0,  # 18 - 1f
-0,0,0,0,7,0,0,0,  # 20 - 27
-3,0,0,0,0,0,0,0,  # 28 - 2f
-0,0,0,0,0,0,0,0,  # 30 - 37
-0,0,0,0,0,0,0,0,  # 38 - 3f
-6,0,4,0,8,0,0,0,  # 40 - 47
-0,9,5,0,0,0,0,0,  # 48 - 4f
-0,0,0,0,0,0,0,0,  # 50 - 57
-0,0,0,0,0,0,0,0,  # 58 - 5f
-0,0,0,0,0,0,0,0,  # 60 - 67
-0,0,0,0,0,0,0,0,  # 68 - 6f
-0,0,0,0,0,0,0,0,  # 70 - 77
-0,0,0,0,0,0,0,0,  # 78 - 7f
-2,2,2,2,2,2,2,2,  # 80 - 87
-2,2,2,2,2,2,2,2,  # 88 - 8f
-2,2,2,2,2,2,2,2,  # 90 - 97
-2,2,2,2,2,2,2,2,  # 98 - 9f
-2,2,2,2,2,2,2,2,  # a0 - a7
-2,2,2,2,2,2,2,2,  # a8 - af
-2,2,2,2,2,2,2,2,  # b0 - b7
-2,2,2,2,2,2,2,2,  # b8 - bf
-2,2,2,2,2,2,2,2,  # c0 - c7
-2,2,2,2,2,2,2,2,  # c8 - cf
-2,2,2,2,2,2,2,2,  # d0 - d7
-2,2,2,2,2,2,2,2,  # d8 - df
-2,2,2,2,2,2,2,2,  # e0 - e7
-2,2,2,2,2,2,2,2,  # e8 - ef
-2,2,2,2,2,2,2,2,  # f0 - f7
-2,2,2,2,2,2,2,2,  # f8 - ff
-)
-
-ISO2022JP_ST = (
-MachineState.START,     3,MachineState.ERROR,MachineState.START,MachineState.START,MachineState.START,MachineState.START,MachineState.START,# 00-07
-MachineState.START,MachineState.START,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,# 08-0f
-MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,# 10-17
-MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ERROR,MachineState.ERROR,# 18-1f
-MachineState.ERROR,     5,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,     4,MachineState.ERROR,MachineState.ERROR,# 20-27
-MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,     6,MachineState.ITS_ME,MachineState.ERROR,MachineState.ITS_ME,MachineState.ERROR,# 28-2f
-MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ITS_ME,MachineState.ITS_ME,# 30-37
-MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ITS_ME,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,# 38-3f
-MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ITS_ME,MachineState.ERROR,MachineState.START,MachineState.START,# 40-47
-)
-
-ISO2022JP_CHAR_LEN_TABLE = (0, 0, 0, 0, 0, 0, 0, 0, 0, 0)
-
-ISO2022JP_SM_MODEL = {'class_table': ISO2022JP_CLS,
-                      'class_factor': 10,
-                      'state_table': ISO2022JP_ST,
-                      'char_len_table': ISO2022JP_CHAR_LEN_TABLE,
-                      'name': "ISO-2022-JP",
-                      'language': 'Japanese'}
-
-ISO2022KR_CLS = (
-2,0,0,0,0,0,0,0,  # 00 - 07
-0,0,0,0,0,0,0,0,  # 08 - 0f
-0,0,0,0,0,0,0,0,  # 10 - 17
-0,0,0,1,0,0,0,0,  # 18 - 1f
-0,0,0,0,3,0,0,0,  # 20 - 27
-0,4,0,0,0,0,0,0,  # 28 - 2f
-0,0,0,0,0,0,0,0,  # 30 - 37
-0,0,0,0,0,0,0,0,  # 38 - 3f
-0,0,0,5,0,0,0,0,  # 40 - 47
-0,0,0,0,0,0,0,0,  # 48 - 4f
-0,0,0,0,0,0,0,0,  # 50 - 57
-0,0,0,0,0,0,0,0,  # 58 - 5f
-0,0,0,0,0,0,0,0,  # 60 - 67
-0,0,0,0,0,0,0,0,  # 68 - 6f
-0,0,0,0,0,0,0,0,  # 70 - 77
-0,0,0,0,0,0,0,0,  # 78 - 7f
-2,2,2,2,2,2,2,2,  # 80 - 87
-2,2,2,2,2,2,2,2,  # 88 - 8f
-2,2,2,2,2,2,2,2,  # 90 - 97
-2,2,2,2,2,2,2,2,  # 98 - 9f
-2,2,2,2,2,2,2,2,  # a0 - a7
-2,2,2,2,2,2,2,2,  # a8 - af
-2,2,2,2,2,2,2,2,  # b0 - b7
-2,2,2,2,2,2,2,2,  # b8 - bf
-2,2,2,2,2,2,2,2,  # c0 - c7
-2,2,2,2,2,2,2,2,  # c8 - cf
-2,2,2,2,2,2,2,2,  # d0 - d7
-2,2,2,2,2,2,2,2,  # d8 - df
-2,2,2,2,2,2,2,2,  # e0 - e7
-2,2,2,2,2,2,2,2,  # e8 - ef
-2,2,2,2,2,2,2,2,  # f0 - f7
-2,2,2,2,2,2,2,2,  # f8 - ff
-)
-
-ISO2022KR_ST = (
-MachineState.START,     3,MachineState.ERROR,MachineState.START,MachineState.START,MachineState.START,MachineState.ERROR,MachineState.ERROR,# 00-07
-MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,# 08-0f
-MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,     4,MachineState.ERROR,MachineState.ERROR,# 10-17
-MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,     5,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,# 18-1f
-MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ITS_ME,MachineState.START,MachineState.START,MachineState.START,MachineState.START,# 20-27
-)
-
-ISO2022KR_CHAR_LEN_TABLE = (0, 0, 0, 0, 0, 0)
-
-ISO2022KR_SM_MODEL = {'class_table': ISO2022KR_CLS,
-                      'class_factor': 6,
-                      'state_table': ISO2022KR_ST,
-                      'char_len_table': ISO2022KR_CHAR_LEN_TABLE,
-                      'name': "ISO-2022-KR",
-                      'language': 'Korean'}
-
-
diff --git a/lib/sub_repos/chardet/chardet/eucjpprober.py b/lib/sub_repos/chardet/chardet/eucjpprober.py
deleted file mode 100644
index 20ce8f7d1..000000000
--- a/lib/sub_repos/chardet/chardet/eucjpprober.py
+++ /dev/null
@@ -1,92 +0,0 @@
-######################## BEGIN LICENSE BLOCK ########################
-# The Original Code is mozilla.org code.
-#
-# The Initial Developer of the Original Code is
-# Netscape Communications Corporation.
-# Portions created by the Initial Developer are Copyright (C) 1998
-# the Initial Developer. All Rights Reserved.
-#
-# Contributor(s):
-#   Mark Pilgrim - port to Python
-#
-# This library is free software; you can redistribute it and/or
-# modify it under the terms of the GNU Lesser General Public
-# License as published by the Free Software Foundation; either
-# version 2.1 of the License, or (at your option) any later version.
-#
-# This library is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-# Lesser General Public License for more details.
-#
-# You should have received a copy of the GNU Lesser General Public
-# License along with this library; if not, write to the Free Software
-# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
-# 02110-1301  USA
-######################### END LICENSE BLOCK #########################
-
-from .enums import ProbingState, MachineState
-from .mbcharsetprober import MultiByteCharSetProber
-from .codingstatemachine import CodingStateMachine
-from .chardistribution import EUCJPDistributionAnalysis
-from .jpcntx import EUCJPContextAnalysis
-from .mbcssm import EUCJP_SM_MODEL
-
-
-class EUCJPProber(MultiByteCharSetProber):
-    def __init__(self):
-        super(EUCJPProber, self).__init__()
-        self.coding_sm = CodingStateMachine(EUCJP_SM_MODEL)
-        self.distribution_analyzer = EUCJPDistributionAnalysis()
-        self.context_analyzer = EUCJPContextAnalysis()
-        self.reset()
-
-    def reset(self):
-        super(EUCJPProber, self).reset()
-        self.context_analyzer.reset()
-
-    @property
-    def charset_name(self):
-        return "EUC-JP"
-
-    @property
-    def language(self):
-        return "Japanese"
-
-    def feed(self, byte_str):
-        for i in range(len(byte_str)):
-            # PY3K: byte_str is a byte array, so byte_str[i] is an int, not a byte
-            coding_state = self.coding_sm.next_state(byte_str[i])
-            if coding_state == MachineState.ERROR:
-                self.logger.debug('%s %s prober hit error at byte %s',
-                                  self.charset_name, self.language, i)
-                self._state = ProbingState.NOT_ME
-                break
-            elif coding_state == MachineState.ITS_ME:
-                self._state = ProbingState.FOUND_IT
-                break
-            elif coding_state == MachineState.START:
-                char_len = self.coding_sm.get_current_charlen()
-                if i == 0:
-                    self._last_char[1] = byte_str[0]
-                    self.context_analyzer.feed(self._last_char, char_len)
-                    self.distribution_analyzer.feed(self._last_char, char_len)
-                else:
-                    self.context_analyzer.feed(byte_str[i - 1:i + 1],
-                                                char_len)
-                    self.distribution_analyzer.feed(byte_str[i - 1:i + 1],
-                                                     char_len)
-
-        self._last_char[0] = byte_str[-1]
-
-        if self.state == ProbingState.DETECTING:
-            if (self.context_analyzer.got_enough_data() and
-               (self.get_confidence() > self.SHORTCUT_THRESHOLD)):
-                self._state = ProbingState.FOUND_IT
-
-        return self.state
-
-    def get_confidence(self):
-        context_conf = self.context_analyzer.get_confidence()
-        distrib_conf = self.distribution_analyzer.get_confidence()
-        return max(context_conf, distrib_conf)
diff --git a/lib/sub_repos/chardet/chardet/euckrfreq.py b/lib/sub_repos/chardet/chardet/euckrfreq.py
deleted file mode 100644
index b68078cb9..000000000
--- a/lib/sub_repos/chardet/chardet/euckrfreq.py
+++ /dev/null
@@ -1,195 +0,0 @@
-######################## BEGIN LICENSE BLOCK ########################
-# The Original Code is Mozilla Communicator client code.
-#
-# The Initial Developer of the Original Code is
-# Netscape Communications Corporation.
-# Portions created by the Initial Developer are Copyright (C) 1998
-# the Initial Developer. All Rights Reserved.
-#
-# Contributor(s):
-#   Mark Pilgrim - port to Python
-#
-# This library is free software; you can redistribute it and/or
-# modify it under the terms of the GNU Lesser General Public
-# License as published by the Free Software Foundation; either
-# version 2.1 of the License, or (at your option) any later version.
-#
-# This library is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-# Lesser General Public License for more details.
-#
-# You should have received a copy of the GNU Lesser General Public
-# License along with this library; if not, write to the Free Software
-# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
-# 02110-1301  USA
-######################### END LICENSE BLOCK #########################
-
-# Sampling from about 20M text materials include literature and computer technology
-
-# 128  --> 0.79
-# 256  --> 0.92
-# 512  --> 0.986
-# 1024 --> 0.99944
-# 2048 --> 0.99999
-#
-# Idea Distribution Ratio = 0.98653 / (1-0.98653) = 73.24
-# Random Distribution Ration = 512 / (2350-512) = 0.279.
-#
-# Typical Distribution Ratio
-
-EUCKR_TYPICAL_DISTRIBUTION_RATIO = 6.0
-
-EUCKR_TABLE_SIZE = 2352
-
-# Char to FreqOrder table ,
-EUCKR_CHAR_TO_FREQ_ORDER = (
-  13, 130, 120,1396, 481,1719,1720, 328, 609, 212,1721, 707, 400, 299,1722,  87,
-1397,1723, 104, 536,1117,1203,1724,1267, 685,1268, 508,1725,1726,1727,1728,1398,
-1399,1729,1730,1731, 141, 621, 326,1057, 368,1732, 267, 488,  20,1733,1269,1734,
- 945,1400,1735,  47, 904,1270,1736,1737, 773, 248,1738, 409, 313, 786, 429,1739,
- 116, 987, 813,1401, 683,  75,1204, 145,1740,1741,1742,1743,  16, 847, 667, 622,
- 708,1744,1745,1746, 966, 787, 304, 129,1747,  60, 820, 123, 676,1748,1749,1750,
-1751, 617,1752, 626,1753,1754,1755,1756, 653,1757,1758,1759,1760,1761,1762, 856,
- 344,1763,1764,1765,1766,  89, 401, 418, 806, 905, 848,1767,1768,1769, 946,1205,
- 709,1770,1118,1771, 241,1772,1773,1774,1271,1775, 569,1776, 999,1777,1778,1779,
-1780, 337, 751,1058,  28, 628, 254,1781, 177, 906, 270, 349, 891,1079,1782,  19,
-1783, 379,1784, 315,1785, 629, 754,1402, 559,1786, 636, 203,1206,1787, 710, 567,
-1788, 935, 814,1789,1790,1207, 766, 528,1791,1792,1208,1793,1794,1795,1796,1797,
-1403,1798,1799, 533,1059,1404,1405,1156,1406, 936, 884,1080,1800, 351,1801,1802,
-1803,1804,1805, 801,1806,1807,1808,1119,1809,1157, 714, 474,1407,1810, 298, 899,
- 885,1811,1120, 802,1158,1812, 892,1813,1814,1408, 659,1815,1816,1121,1817,1818,
-1819,1820,1821,1822, 319,1823, 594, 545,1824, 815, 937,1209,1825,1826, 573,1409,
-1022,1827,1210,1828,1829,1830,1831,1832,1833, 556, 722, 807,1122,1060,1834, 697,
-1835, 900, 557, 715,1836,1410, 540,1411, 752,1159, 294, 597,1211, 976, 803, 770,
-1412,1837,1838,  39, 794,1413, 358,1839, 371, 925,1840, 453, 661, 788, 531, 723,
- 544,1023,1081, 869,  91,1841, 392, 430, 790, 602,1414, 677,1082, 457,1415,1416,
-1842,1843, 475, 327,1024,1417, 795, 121,1844, 733, 403,1418,1845,1846,1847, 300,
- 119, 711,1212, 627,1848,1272, 207,1849,1850, 796,1213, 382,1851, 519,1852,1083,
- 893,1853,1854,1855, 367, 809, 487, 671,1856, 663,1857,1858, 956, 471, 306, 857,
-1859,1860,1160,1084,1861,1862,1863,1864,1865,1061,1866,1867,1868,1869,1870,1871,
- 282,  96, 574,1872, 502,1085,1873,1214,1874, 907,1875,1876, 827, 977,1419,1420,
-1421, 268,1877,1422,1878,1879,1880, 308,1881,   2, 537,1882,1883,1215,1884,1885,
- 127, 791,1886,1273,1423,1887,  34, 336, 404, 643,1888, 571, 654, 894, 840,1889,
-   0, 886,1274, 122, 575, 260, 908, 938,1890,1275, 410, 316,1891,1892, 100,1893,
-1894,1123,  48,1161,1124,1025,1895, 633, 901,1276,1896,1897, 115, 816,1898, 317,
-1899, 694,1900, 909, 734,1424, 572, 866,1425, 691,  85, 524,1010, 543, 394, 841,
-1901,1902,1903,1026,1904,1905,1906,1907,1908,1909,  30, 451, 651, 988, 310,1910,
-1911,1426, 810,1216,  93,1912,1913,1277,1217,1914, 858, 759,  45,  58, 181, 610,
- 269,1915,1916, 131,1062, 551, 443,1000, 821,1427, 957, 895,1086,1917,1918, 375,
-1919, 359,1920, 687,1921, 822,1922, 293,1923,1924,  40, 662, 118, 692,  29, 939,
- 887, 640, 482, 174,1925,  69,1162, 728,1428, 910,1926,1278,1218,1279, 386, 870,
- 217, 854,1163, 823,1927,1928,1929,1930, 834,1931,  78,1932, 859,1933,1063,1934,
-1935,1936,1937, 438,1164, 208, 595,1938,1939,1940,1941,1219,1125,1942, 280, 888,
-1429,1430,1220,1431,1943,1944,1945,1946,1947,1280, 150, 510,1432,1948,1949,1950,
-1951,1952,1953,1954,1011,1087,1955,1433,1043,1956, 881,1957, 614, 958,1064,1065,
-1221,1958, 638,1001, 860, 967, 896,1434, 989, 492, 553,1281,1165,1959,1282,1002,
-1283,1222,1960,1961,1962,1963,  36, 383, 228, 753, 247, 454,1964, 876, 678,1965,
-1966,1284, 126, 464, 490, 835, 136, 672, 529, 940,1088,1435, 473,1967,1968, 467,
-  50, 390, 227, 587, 279, 378, 598, 792, 968, 240, 151, 160, 849, 882,1126,1285,
- 639,1044, 133, 140, 288, 360, 811, 563,1027, 561, 142, 523,1969,1970,1971,   7,
- 103, 296, 439, 407, 506, 634, 990,1972,1973,1974,1975, 645,1976,1977,1978,1979,
-1980,1981, 236,1982,1436,1983,1984,1089, 192, 828, 618, 518,1166, 333,1127,1985,
- 818,1223,1986,1987,1988,1989,1990,1991,1992,1993, 342,1128,1286, 746, 842,1994,
-1995, 560, 223,1287,  98,   8, 189, 650, 978,1288,1996,1437,1997,  17, 345, 250,
- 423, 277, 234, 512, 226,  97, 289,  42, 167,1998, 201,1999,2000, 843, 836, 824,
- 532, 338, 783,1090, 182, 576, 436,1438,1439, 527, 500,2001, 947, 889,2002,2003,
-2004,2005, 262, 600, 314, 447,2006, 547,2007, 693, 738,1129,2008,  71,1440, 745,
- 619, 688,2009, 829,2010,2011, 147,2012,  33, 948,2013,2014,  74, 224,2015,  61,
- 191, 918, 399, 637,2016,1028,1130, 257, 902,2017,2018,2019,2020,2021,2022,2023,
-2024,2025,2026, 837,2027,2028,2029,2030, 179, 874, 591,  52, 724, 246,2031,2032,
-2033,2034,1167, 969,2035,1289, 630, 605, 911,1091,1168,2036,2037,2038,1441, 912,
-2039, 623,2040,2041, 253,1169,1290,2042,1442, 146, 620, 611, 577, 433,2043,1224,
- 719,1170, 959, 440, 437, 534,  84, 388, 480,1131, 159, 220, 198, 679,2044,1012,
- 819,1066,1443, 113,1225, 194, 318,1003,1029,2045,2046,2047,2048,1067,2049,2050,
-2051,2052,2053,  59, 913, 112,2054, 632,2055, 455, 144, 739,1291,2056, 273, 681,
- 499,2057, 448,2058,2059, 760,2060,2061, 970, 384, 169, 245,1132,2062,2063, 414,
-1444,2064,2065,  41, 235,2066, 157, 252, 877, 568, 919, 789, 580,2067, 725,2068,
-2069,1292,2070,2071,1445,2072,1446,2073,2074,  55, 588,  66,1447, 271,1092,2075,
-1226,2076, 960,1013, 372,2077,2078,2079,2080,2081,1293,2082,2083,2084,2085, 850,
-2086,2087,2088,2089,2090, 186,2091,1068, 180,2092,2093,2094, 109,1227, 522, 606,
-2095, 867,1448,1093, 991,1171, 926, 353,1133,2096, 581,2097,2098,2099,1294,1449,
-1450,2100, 596,1172,1014,1228,2101,1451,1295,1173,1229,2102,2103,1296,1134,1452,
- 949,1135,2104,2105,1094,1453,1454,1455,2106,1095,2107,2108,2109,2110,2111,2112,
-2113,2114,2115,2116,2117, 804,2118,2119,1230,1231, 805,1456, 405,1136,2120,2121,
-2122,2123,2124, 720, 701,1297, 992,1457, 927,1004,2125,2126,2127,2128,2129,2130,
-  22, 417,2131, 303,2132, 385,2133, 971, 520, 513,2134,1174,  73,1096, 231, 274,
- 962,1458, 673,2135,1459,2136, 152,1137,2137,2138,2139,2140,1005,1138,1460,1139,
-2141,2142,2143,2144,  11, 374, 844,2145, 154,1232,  46,1461,2146, 838, 830, 721,
-1233, 106,2147,  90, 428, 462, 578, 566,1175, 352,2148,2149, 538,1234, 124,1298,
-2150,1462, 761, 565,2151, 686,2152, 649,2153,  72, 173,2154, 460, 415,2155,1463,
-2156,1235, 305,2157,2158,2159,2160,2161,2162, 579,2163,2164,2165,2166,2167, 747,
-2168,2169,2170,2171,1464, 669,2172,2173,2174,2175,2176,1465,2177,  23, 530, 285,
-2178, 335, 729,2179, 397,2180,2181,2182,1030,2183,2184, 698,2185,2186, 325,2187,
-2188, 369,2189, 799,1097,1015, 348,2190,1069, 680,2191, 851,1466,2192,2193,  10,
-2194, 613, 424,2195, 979, 108, 449, 589,  27, 172,  81,1031,  80, 774, 281, 350,
-1032, 525, 301, 582,1176,2196, 674,1045,2197,2198,1467, 730, 762,2199,2200,2201,
-2202,1468,2203, 993,2204,2205, 266,1070, 963,1140,2206,2207,2208, 664,1098, 972,
-2209,2210,2211,1177,1469,1470, 871,2212,2213,2214,2215,2216,1471,2217,2218,2219,
-2220,2221,2222,2223,2224,2225,2226,2227,1472,1236,2228,2229,2230,2231,2232,2233,
-2234,2235,1299,2236,2237, 200,2238, 477, 373,2239,2240, 731, 825, 777,2241,2242,
-2243, 521, 486, 548,2244,2245,2246,1473,1300,  53, 549, 137, 875,  76, 158,2247,
-1301,1474, 469, 396,1016, 278, 712,2248, 321, 442, 503, 767, 744, 941,1237,1178,
-1475,2249,  82, 178,1141,1179, 973,2250,1302,2251, 297,2252,2253, 570,2254,2255,
-2256,  18, 450, 206,2257, 290, 292,1142,2258, 511, 162,  99, 346, 164, 735,2259,
-1476,1477,   4, 554, 343, 798,1099,2260,1100,2261,  43, 171,1303, 139, 215,2262,
-2263, 717, 775,2264,1033, 322, 216,2265, 831,2266, 149,2267,1304,2268,2269, 702,
-1238, 135, 845, 347, 309,2270, 484,2271, 878, 655, 238,1006,1478,2272,  67,2273,
- 295,2274,2275, 461,2276, 478, 942, 412,2277,1034,2278,2279,2280, 265,2281, 541,
-2282,2283,2284,2285,2286,  70, 852,1071,2287,2288,2289,2290,  21,  56, 509, 117,
- 432,2291,2292, 331, 980, 552,1101, 148, 284, 105, 393,1180,1239, 755,2293, 187,
-2294,1046,1479,2295, 340,2296,  63,1047, 230,2297,2298,1305, 763,1306, 101, 800,
- 808, 494,2299,2300,2301, 903,2302,  37,1072,  14,   5,2303,  79, 675,2304, 312,
-2305,2306,2307,2308,2309,1480,   6,1307,2310,2311,2312,   1, 470,  35,  24, 229,
-2313, 695, 210,  86, 778,  15, 784, 592, 779,  32,  77, 855, 964,2314, 259,2315,
- 501, 380,2316,2317,  83, 981, 153, 689,1308,1481,1482,1483,2318,2319, 716,1484,
-2320,2321,2322,2323,2324,2325,1485,2326,2327, 128,  57,  68, 261,1048, 211, 170,
-1240,  31,2328,  51, 435, 742,2329,2330,2331, 635,2332, 264, 456,2333,2334,2335,
- 425,2336,1486, 143, 507, 263, 943,2337, 363, 920,1487, 256,1488,1102, 243, 601,
-1489,2338,2339,2340,2341,2342,2343,2344, 861,2345,2346,2347,2348,2349,2350, 395,
-2351,1490,1491,  62, 535, 166, 225,2352,2353, 668, 419,1241, 138, 604, 928,2354,
-1181,2355,1492,1493,2356,2357,2358,1143,2359, 696,2360, 387, 307,1309, 682, 476,
-2361,2362, 332,  12, 222, 156,2363, 232,2364, 641, 276, 656, 517,1494,1495,1035,
- 416, 736,1496,2365,1017, 586,2366,2367,2368,1497,2369, 242,2370,2371,2372,1498,
-2373, 965, 713,2374,2375,2376,2377, 740, 982,1499, 944,1500,1007,2378,2379,1310,
-1501,2380,2381,2382, 785, 329,2383,2384,1502,2385,2386,2387, 932,2388,1503,2389,
-2390,2391,2392,1242,2393,2394,2395,2396,2397, 994, 950,2398,2399,2400,2401,1504,
-1311,2402,2403,2404,2405,1049, 749,2406,2407, 853, 718,1144,1312,2408,1182,1505,
-2409,2410, 255, 516, 479, 564, 550, 214,1506,1507,1313, 413, 239, 444, 339,1145,
-1036,1508,1509,1314,1037,1510,1315,2411,1511,2412,2413,2414, 176, 703, 497, 624,
- 593, 921, 302,2415, 341, 165,1103,1512,2416,1513,2417,2418,2419, 376,2420, 700,
-2421,2422,2423, 258, 768,1316,2424,1183,2425, 995, 608,2426,2427,2428,2429, 221,
-2430,2431,2432,2433,2434,2435,2436,2437, 195, 323, 726, 188, 897, 983,1317, 377,
- 644,1050, 879,2438, 452,2439,2440,2441,2442,2443,2444, 914,2445,2446,2447,2448,
- 915, 489,2449,1514,1184,2450,2451, 515,  64, 427, 495,2452, 583,2453, 483, 485,
-1038, 562, 213,1515, 748, 666,2454,2455,2456,2457, 334,2458, 780, 996,1008, 705,
-1243,2459,2460,2461,2462,2463, 114,2464, 493,1146, 366, 163,1516, 961,1104,2465,
- 291,2466,1318,1105,2467,1517, 365,2468, 355, 951,1244,2469,1319,2470, 631,2471,
-2472, 218,1320, 364, 320, 756,1518,1519,1321,1520,1322,2473,2474,2475,2476, 997,
-2477,2478,2479,2480, 665,1185,2481, 916,1521,2482,2483,2484, 584, 684,2485,2486,
- 797,2487,1051,1186,2488,2489,2490,1522,2491,2492, 370,2493,1039,1187,  65,2494,
- 434, 205, 463,1188,2495, 125, 812, 391, 402, 826, 699, 286, 398, 155, 781, 771,
- 585,2496, 590, 505,1073,2497, 599, 244, 219, 917,1018, 952, 646,1523,2498,1323,
-2499,2500,  49, 984, 354, 741,2501, 625,2502,1324,2503,1019, 190, 357, 757, 491,
-  95, 782, 868,2504,2505,2506,2507,2508,2509, 134,1524,1074, 422,1525, 898,2510,
- 161,2511,2512,2513,2514, 769,2515,1526,2516,2517, 411,1325,2518, 472,1527,2519,
-2520,2521,2522,2523,2524, 985,2525,2526,2527,2528,2529,2530, 764,2531,1245,2532,
-2533,  25, 204, 311,2534, 496,2535,1052,2536,2537,2538,2539,2540,2541,2542, 199,
- 704, 504, 468, 758, 657,1528, 196,  44, 839,1246, 272, 750,2543, 765, 862,2544,
-2545,1326,2546, 132, 615, 933,2547, 732,2548,2549,2550,1189,1529,2551, 283,1247,
-1053, 607, 929,2552,2553,2554, 930, 183, 872, 616,1040,1147,2555,1148,1020, 441,
- 249,1075,2556,2557,2558, 466, 743,2559,2560,2561,  92, 514, 426, 420, 526,2562,
-2563,2564,2565,2566,2567,2568, 185,2569,2570,2571,2572, 776,1530, 658,2573, 362,
-2574, 361, 922,1076, 793,2575,2576,2577,2578,2579,2580,1531, 251,2581,2582,2583,
-2584,1532,  54, 612, 237,1327,2585,2586, 275, 408, 647, 111,2587,1533,1106, 465,
-   3, 458,   9,  38,2588, 107, 110, 890, 209,  26, 737, 498,2589,1534,2590, 431,
- 202,  88,1535, 356, 287,1107, 660,1149,2591, 381,1536, 986,1150, 445,1248,1151,
- 974,2592,2593, 846,2594, 446, 953, 184,1249,1250, 727,2595, 923, 193, 883,2596,
-2597,2598, 102, 324, 539, 817,2599, 421,1041,2600, 832,2601,  94, 175, 197, 406,
-2602, 459,2603,2604,2605,2606,2607, 330, 555,2608,2609,2610, 706,1108, 389,2611,
-2612,2613,2614, 233,2615, 833, 558, 931, 954,1251,2616,2617,1537, 546,2618,2619,
-1009,2620,2621,2622,1538, 690,1328,2623, 955,2624,1539,2625,2626, 772,2627,2628,
-2629,2630,2631, 924, 648, 863, 603,2632,2633, 934,1540, 864, 865,2634, 642,1042,
- 670,1190,2635,2636,2637,2638, 168,2639, 652, 873, 542,1054,1541,2640,2641,2642,  # 512, 256
-)
-
diff --git a/lib/sub_repos/chardet/chardet/euckrprober.py b/lib/sub_repos/chardet/chardet/euckrprober.py
deleted file mode 100644
index 345a060d0..000000000
--- a/lib/sub_repos/chardet/chardet/euckrprober.py
+++ /dev/null
@@ -1,47 +0,0 @@
-######################## BEGIN LICENSE BLOCK ########################
-# The Original Code is mozilla.org code.
-#
-# The Initial Developer of the Original Code is
-# Netscape Communications Corporation.
-# Portions created by the Initial Developer are Copyright (C) 1998
-# the Initial Developer. All Rights Reserved.
-#
-# Contributor(s):
-#   Mark Pilgrim - port to Python
-#
-# This library is free software; you can redistribute it and/or
-# modify it under the terms of the GNU Lesser General Public
-# License as published by the Free Software Foundation; either
-# version 2.1 of the License, or (at your option) any later version.
-#
-# This library is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-# Lesser General Public License for more details.
-#
-# You should have received a copy of the GNU Lesser General Public
-# License along with this library; if not, write to the Free Software
-# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
-# 02110-1301  USA
-######################### END LICENSE BLOCK #########################
-
-from .mbcharsetprober import MultiByteCharSetProber
-from .codingstatemachine import CodingStateMachine
-from .chardistribution import EUCKRDistributionAnalysis
-from .mbcssm import EUCKR_SM_MODEL
-
-
-class EUCKRProber(MultiByteCharSetProber):
-    def __init__(self):
-        super(EUCKRProber, self).__init__()
-        self.coding_sm = CodingStateMachine(EUCKR_SM_MODEL)
-        self.distribution_analyzer = EUCKRDistributionAnalysis()
-        self.reset()
-
-    @property
-    def charset_name(self):
-        return "EUC-KR"
-
-    @property
-    def language(self):
-        return "Korean"
diff --git a/lib/sub_repos/chardet/chardet/euctwfreq.py b/lib/sub_repos/chardet/chardet/euctwfreq.py
deleted file mode 100644
index ed7a995a3..000000000
--- a/lib/sub_repos/chardet/chardet/euctwfreq.py
+++ /dev/null
@@ -1,387 +0,0 @@
-######################## BEGIN LICENSE BLOCK ########################
-# The Original Code is Mozilla Communicator client code.
-#
-# The Initial Developer of the Original Code is
-# Netscape Communications Corporation.
-# Portions created by the Initial Developer are Copyright (C) 1998
-# the Initial Developer. All Rights Reserved.
-#
-# Contributor(s):
-#   Mark Pilgrim - port to Python
-#
-# This library is free software; you can redistribute it and/or
-# modify it under the terms of the GNU Lesser General Public
-# License as published by the Free Software Foundation; either
-# version 2.1 of the License, or (at your option) any later version.
-#
-# This library is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-# Lesser General Public License for more details.
-#
-# You should have received a copy of the GNU Lesser General Public
-# License along with this library; if not, write to the Free Software
-# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
-# 02110-1301  USA
-######################### END LICENSE BLOCK #########################
-
-# EUCTW frequency table
-# Converted from big5 work
-# by Taiwan's Mandarin Promotion Council
-# 
-
-# 128  --> 0.42261
-# 256  --> 0.57851
-# 512  --> 0.74851
-# 1024 --> 0.89384
-# 2048 --> 0.97583
-#
-# Idea Distribution Ratio = 0.74851/(1-0.74851) =2.98
-# Random Distribution Ration = 512/(5401-512)=0.105
-#
-# Typical Distribution Ratio about 25% of Ideal one, still much higher than RDR
-
-EUCTW_TYPICAL_DISTRIBUTION_RATIO = 0.75
-
-# Char to FreqOrder table ,
-EUCTW_TABLE_SIZE = 5376
-
-EUCTW_CHAR_TO_FREQ_ORDER = (
-   1,1800,1506, 255,1431, 198,   9,  82,   6,7310, 177, 202,3615,1256,2808, 110,  # 2742
-3735,  33,3241, 261,  76,  44,2113,  16,2931,2184,1176, 659,3868,  26,3404,2643,  # 2758
-1198,3869,3313,4060, 410,2211, 302, 590, 361,1963,   8, 204,  58,4296,7311,1931,  # 2774
-  63,7312,7313, 317,1614,  75, 222, 159,4061,2412,1480,7314,3500,3068, 224,2809,  # 2790
-3616,   3,  10,3870,1471,  29,2774,1135,2852,1939, 873, 130,3242,1123, 312,7315,  # 2806
-4297,2051, 507, 252, 682,7316, 142,1914, 124, 206,2932,  34,3501,3173,  64, 604,  # 2822
-7317,2494,1976,1977, 155,1990, 645, 641,1606,7318,3405, 337,  72, 406,7319,  80,  # 2838
- 630, 238,3174,1509, 263, 939,1092,2644, 756,1440,1094,3406, 449,  69,2969, 591,  # 2854
- 179,2095, 471, 115,2034,1843,  60,  50,2970, 134, 806,1868, 734,2035,3407, 180,  # 2870
- 995,1607, 156, 537,2893, 688,7320, 319,1305, 779,2144, 514,2374, 298,4298, 359,  # 2886
-2495,  90,2707,1338, 663,  11, 906,1099,2545,  20,2436, 182, 532,1716,7321, 732,  # 2902
-1376,4062,1311,1420,3175,  25,2312,1056, 113, 399, 382,1949, 242,3408,2467, 529,  # 2918
-3243, 475,1447,3617,7322, 117,  21, 656, 810,1297,2295,2329,3502,7323, 126,4063,  # 2934
- 706, 456, 150, 613,4299,  71,1118,2036,4064, 145,3069,  85, 835, 486,2114,1246,  # 2950
-1426, 428, 727,1285,1015, 800, 106, 623, 303,1281,7324,2127,2354, 347,3736, 221,  # 2966
-3503,3110,7325,1955,1153,4065,  83, 296,1199,3070, 192, 624,  93,7326, 822,1897,  # 2982
-2810,3111, 795,2064, 991,1554,1542,1592,  27,  43,2853, 859, 139,1456, 860,4300,  # 2998
- 437, 712,3871, 164,2392,3112, 695, 211,3017,2096, 195,3872,1608,3504,3505,3618,  # 3014
-3873, 234, 811,2971,2097,3874,2229,1441,3506,1615,2375, 668,2076,1638, 305, 228,  # 3030
-1664,4301, 467, 415,7327, 262,2098,1593, 239, 108, 300, 200,1033, 512,1247,2077,  # 3046
-7328,7329,2173,3176,3619,2673, 593, 845,1062,3244,  88,1723,2037,3875,1950, 212,  # 3062
- 266, 152, 149, 468,1898,4066,4302,  77, 187,7330,3018,  37,   5,2972,7331,3876,  # 3078
-7332,7333,  39,2517,4303,2894,3177,2078,  55, 148,  74,4304, 545, 483,1474,1029,  # 3094
-1665, 217,1869,1531,3113,1104,2645,4067,  24, 172,3507, 900,3877,3508,3509,4305,  # 3110
-  32,1408,2811,1312, 329, 487,2355,2247,2708, 784,2674,   4,3019,3314,1427,1788,  # 3126
- 188, 109, 499,7334,3620,1717,1789, 888,1217,3020,4306,7335,3510,7336,3315,1520,  # 3142
-3621,3878, 196,1034, 775,7337,7338, 929,1815, 249, 439,  38,7339,1063,7340, 794,  # 3158
-3879,1435,2296,  46, 178,3245,2065,7341,2376,7342, 214,1709,4307, 804,  35, 707,  # 3174
- 324,3622,1601,2546, 140, 459,4068,7343,7344,1365, 839, 272, 978,2257,2572,3409,  # 3190
-2128,1363,3623,1423, 697, 100,3071,  48,  70,1231, 495,3114,2193,7345,1294,7346,  # 3206
-2079, 462, 586,1042,3246, 853, 256, 988, 185,2377,3410,1698, 434,1084,7347,3411,  # 3222
- 314,2615,2775,4308,2330,2331, 569,2280, 637,1816,2518, 757,1162,1878,1616,3412,  # 3238
- 287,1577,2115, 768,4309,1671,2854,3511,2519,1321,3737, 909,2413,7348,4069, 933,  # 3254
-3738,7349,2052,2356,1222,4310, 765,2414,1322, 786,4311,7350,1919,1462,1677,2895,  # 3270
-1699,7351,4312,1424,2437,3115,3624,2590,3316,1774,1940,3413,3880,4070, 309,1369,  # 3286
-1130,2812, 364,2230,1653,1299,3881,3512,3882,3883,2646, 525,1085,3021, 902,2000,  # 3302
-1475, 964,4313, 421,1844,1415,1057,2281, 940,1364,3116, 376,4314,4315,1381,   7,  # 3318
-2520, 983,2378, 336,1710,2675,1845, 321,3414, 559,1131,3022,2742,1808,1132,1313,  # 3334
- 265,1481,1857,7352, 352,1203,2813,3247, 167,1089, 420,2814, 776, 792,1724,3513,  # 3350
-4071,2438,3248,7353,4072,7354, 446, 229, 333,2743, 901,3739,1200,1557,4316,2647,  # 3366
-1920, 395,2744,2676,3740,4073,1835, 125, 916,3178,2616,4317,7355,7356,3741,7357,  # 3382
-7358,7359,4318,3117,3625,1133,2547,1757,3415,1510,2313,1409,3514,7360,2145, 438,  # 3398
-2591,2896,2379,3317,1068, 958,3023, 461, 311,2855,2677,4074,1915,3179,4075,1978,  # 3414
- 383, 750,2745,2617,4076, 274, 539, 385,1278,1442,7361,1154,1964, 384, 561, 210,  # 3430
-  98,1295,2548,3515,7362,1711,2415,1482,3416,3884,2897,1257, 129,7363,3742, 642,  # 3446
- 523,2776,2777,2648,7364, 141,2231,1333,  68, 176, 441, 876, 907,4077, 603,2592,  # 3462
- 710, 171,3417, 404, 549,  18,3118,2393,1410,3626,1666,7365,3516,4319,2898,4320,  # 3478
-7366,2973, 368,7367, 146, 366,  99, 871,3627,1543, 748, 807,1586,1185,  22,2258,  # 3494
- 379,3743,3180,7368,3181, 505,1941,2618,1991,1382,2314,7369, 380,2357, 218, 702,  # 3510
-1817,1248,3418,3024,3517,3318,3249,7370,2974,3628, 930,3250,3744,7371,  59,7372,  # 3526
- 585, 601,4078, 497,3419,1112,1314,4321,1801,7373,1223,1472,2174,7374, 749,1836,  # 3542
- 690,1899,3745,1772,3885,1476, 429,1043,1790,2232,2116, 917,4079, 447,1086,1629,  # 3558
-7375, 556,7376,7377,2020,1654, 844,1090, 105, 550, 966,1758,2815,1008,1782, 686,  # 3574
-1095,7378,2282, 793,1602,7379,3518,2593,4322,4080,2933,2297,4323,3746, 980,2496,  # 3590
- 544, 353, 527,4324, 908,2678,2899,7380, 381,2619,1942,1348,7381,1341,1252, 560,  # 3606
-3072,7382,3420,2856,7383,2053, 973, 886,2080, 143,4325,7384,7385, 157,3886, 496,  # 3622
-4081,  57, 840, 540,2038,4326,4327,3421,2117,1445, 970,2259,1748,1965,2081,4082,  # 3638
-3119,1234,1775,3251,2816,3629, 773,1206,2129,1066,2039,1326,3887,1738,1725,4083,  # 3654
- 279,3120,  51,1544,2594, 423,1578,2130,2066, 173,4328,1879,7386,7387,1583, 264,  # 3670
- 610,3630,4329,2439, 280, 154,7388,7389,7390,1739, 338,1282,3073, 693,2857,1411,  # 3686
-1074,3747,2440,7391,4330,7392,7393,1240, 952,2394,7394,2900,1538,2679, 685,1483,  # 3702
-4084,2468,1436, 953,4085,2054,4331, 671,2395,  79,4086,2441,3252, 608, 567,2680,  # 3718
-3422,4087,4088,1691, 393,1261,1791,2396,7395,4332,7396,7397,7398,7399,1383,1672,  # 3734
-3748,3182,1464, 522,1119, 661,1150, 216, 675,4333,3888,1432,3519, 609,4334,2681,  # 3750
-2397,7400,7401,7402,4089,3025,   0,7403,2469, 315, 231,2442, 301,3319,4335,2380,  # 3766
-7404, 233,4090,3631,1818,4336,4337,7405,  96,1776,1315,2082,7406, 257,7407,1809,  # 3782
-3632,2709,1139,1819,4091,2021,1124,2163,2778,1777,2649,7408,3074, 363,1655,3183,  # 3798
-7409,2975,7410,7411,7412,3889,1567,3890, 718, 103,3184, 849,1443, 341,3320,2934,  # 3814
-1484,7413,1712, 127,  67, 339,4092,2398, 679,1412, 821,7414,7415, 834, 738, 351,  # 3830
-2976,2146, 846, 235,1497,1880, 418,1992,3749,2710, 186,1100,2147,2746,3520,1545,  # 3846
-1355,2935,2858,1377, 583,3891,4093,2573,2977,7416,1298,3633,1078,2549,3634,2358,  # 3862
-  78,3750,3751, 267,1289,2099,2001,1594,4094, 348, 369,1274,2194,2175,1837,4338,  # 3878
-1820,2817,3635,2747,2283,2002,4339,2936,2748, 144,3321, 882,4340,3892,2749,3423,  # 3894
-4341,2901,7417,4095,1726, 320,7418,3893,3026, 788,2978,7419,2818,1773,1327,2859,  # 3910
-3894,2819,7420,1306,4342,2003,1700,3752,3521,2359,2650, 787,2022, 506, 824,3636,  # 3926
- 534, 323,4343,1044,3322,2023,1900, 946,3424,7421,1778,1500,1678,7422,1881,4344,  # 3942
- 165, 243,4345,3637,2521, 123, 683,4096, 764,4346,  36,3895,1792, 589,2902, 816,  # 3958
- 626,1667,3027,2233,1639,1555,1622,3753,3896,7423,3897,2860,1370,1228,1932, 891,  # 3974
-2083,2903, 304,4097,7424, 292,2979,2711,3522, 691,2100,4098,1115,4347, 118, 662,  # 3990
-7425, 611,1156, 854,2381,1316,2861,   2, 386, 515,2904,7426,7427,3253, 868,2234,  # 4006
-1486, 855,2651, 785,2212,3028,7428,1040,3185,3523,7429,3121, 448,7430,1525,7431,  # 4022
-2164,4348,7432,3754,7433,4099,2820,3524,3122, 503, 818,3898,3123,1568, 814, 676,  # 4038
-1444, 306,1749,7434,3755,1416,1030, 197,1428, 805,2821,1501,4349,7435,7436,7437,  # 4054
-1993,7438,4350,7439,7440,2195,  13,2779,3638,2980,3124,1229,1916,7441,3756,2131,  # 4070
-7442,4100,4351,2399,3525,7443,2213,1511,1727,1120,7444,7445, 646,3757,2443, 307,  # 4086
-7446,7447,1595,3186,7448,7449,7450,3639,1113,1356,3899,1465,2522,2523,7451, 519,  # 4102
-7452, 128,2132,  92,2284,1979,7453,3900,1512, 342,3125,2196,7454,2780,2214,1980,  # 4118
-3323,7455, 290,1656,1317, 789, 827,2360,7456,3758,4352, 562, 581,3901,7457, 401,  # 4134
-4353,2248,  94,4354,1399,2781,7458,1463,2024,4355,3187,1943,7459, 828,1105,4101,  # 4150
-1262,1394,7460,4102, 605,4356,7461,1783,2862,7462,2822, 819,2101, 578,2197,2937,  # 4166
-7463,1502, 436,3254,4103,3255,2823,3902,2905,3425,3426,7464,2712,2315,7465,7466,  # 4182
-2332,2067,  23,4357, 193, 826,3759,2102, 699,1630,4104,3075, 390,1793,1064,3526,  # 4198
-7467,1579,3076,3077,1400,7468,4105,1838,1640,2863,7469,4358,4359, 137,4106, 598,  # 4214
-3078,1966, 780, 104, 974,2938,7470, 278, 899, 253, 402, 572, 504, 493,1339,7471,  # 4230
-3903,1275,4360,2574,2550,7472,3640,3029,3079,2249, 565,1334,2713, 863,  41,7473,  # 4246
-7474,4361,7475,1657,2333,  19, 463,2750,4107, 606,7476,2981,3256,1087,2084,1323,  # 4262
-2652,2982,7477,1631,1623,1750,4108,2682,7478,2864, 791,2714,2653,2334, 232,2416,  # 4278
-7479,2983,1498,7480,2654,2620, 755,1366,3641,3257,3126,2025,1609, 119,1917,3427,  # 4294
- 862,1026,4109,7481,3904,3760,4362,3905,4363,2260,1951,2470,7482,1125, 817,4110,  # 4310
-4111,3906,1513,1766,2040,1487,4112,3030,3258,2824,3761,3127,7483,7484,1507,7485,  # 4326
-2683, 733,  40,1632,1106,2865, 345,4113, 841,2524, 230,4364,2984,1846,3259,3428,  # 4342
-7486,1263, 986,3429,7487, 735, 879, 254,1137, 857, 622,1300,1180,1388,1562,3907,  # 4358
-3908,2939, 967,2751,2655,1349, 592,2133,1692,3324,2985,1994,4114,1679,3909,1901,  # 4374
-2185,7488, 739,3642,2715,1296,1290,7489,4115,2198,2199,1921,1563,2595,2551,1870,  # 4390
-2752,2986,7490, 435,7491, 343,1108, 596,  17,1751,4365,2235,3430,3643,7492,4366,  # 4406
- 294,3527,2940,1693, 477, 979, 281,2041,3528, 643,2042,3644,2621,2782,2261,1031,  # 4422
-2335,2134,2298,3529,4367, 367,1249,2552,7493,3530,7494,4368,1283,3325,2004, 240,  # 4438
-1762,3326,4369,4370, 836,1069,3128, 474,7495,2148,2525, 268,3531,7496,3188,1521,  # 4454
-1284,7497,1658,1546,4116,7498,3532,3533,7499,4117,3327,2684,1685,4118, 961,1673,  # 4470
-2622, 190,2005,2200,3762,4371,4372,7500, 570,2497,3645,1490,7501,4373,2623,3260,  # 4486
-1956,4374, 584,1514, 396,1045,1944,7502,4375,1967,2444,7503,7504,4376,3910, 619,  # 4502
-7505,3129,3261, 215,2006,2783,2553,3189,4377,3190,4378, 763,4119,3763,4379,7506,  # 4518
-7507,1957,1767,2941,3328,3646,1174, 452,1477,4380,3329,3130,7508,2825,1253,2382,  # 4534
-2186,1091,2285,4120, 492,7509, 638,1169,1824,2135,1752,3911, 648, 926,1021,1324,  # 4550
-4381, 520,4382, 997, 847,1007, 892,4383,3764,2262,1871,3647,7510,2400,1784,4384,  # 4566
-1952,2942,3080,3191,1728,4121,2043,3648,4385,2007,1701,3131,1551,  30,2263,4122,  # 4582
-7511,2026,4386,3534,7512, 501,7513,4123, 594,3431,2165,1821,3535,3432,3536,3192,  # 4598
- 829,2826,4124,7514,1680,3132,1225,4125,7515,3262,4387,4126,3133,2336,7516,4388,  # 4614
-4127,7517,3912,3913,7518,1847,2383,2596,3330,7519,4389, 374,3914, 652,4128,4129,  # 4630
- 375,1140, 798,7520,7521,7522,2361,4390,2264, 546,1659, 138,3031,2445,4391,7523,  # 4646
-2250, 612,1848, 910, 796,3765,1740,1371, 825,3766,3767,7524,2906,2554,7525, 692,  # 4662
- 444,3032,2624, 801,4392,4130,7526,1491, 244,1053,3033,4131,4132, 340,7527,3915,  # 4678
-1041,2987, 293,1168,  87,1357,7528,1539, 959,7529,2236, 721, 694,4133,3768, 219,  # 4694
-1478, 644,1417,3331,2656,1413,1401,1335,1389,3916,7530,7531,2988,2362,3134,1825,  # 4710
- 730,1515, 184,2827,  66,4393,7532,1660,2943, 246,3332, 378,1457, 226,3433, 975,  # 4726
-3917,2944,1264,3537, 674, 696,7533, 163,7534,1141,2417,2166, 713,3538,3333,4394,  # 4742
-3918,7535,7536,1186,  15,7537,1079,1070,7538,1522,3193,3539, 276,1050,2716, 758,  # 4758
-1126, 653,2945,3263,7539,2337, 889,3540,3919,3081,2989, 903,1250,4395,3920,3434,  # 4774
-3541,1342,1681,1718, 766,3264, 286,  89,2946,3649,7540,1713,7541,2597,3334,2990,  # 4790
-7542,2947,2215,3194,2866,7543,4396,2498,2526, 181, 387,1075,3921, 731,2187,3335,  # 4806
-7544,3265, 310, 313,3435,2299, 770,4134,  54,3034, 189,4397,3082,3769,3922,7545,  # 4822
-1230,1617,1849, 355,3542,4135,4398,3336, 111,4136,3650,1350,3135,3436,3035,4137,  # 4838
-2149,3266,3543,7546,2784,3923,3924,2991, 722,2008,7547,1071, 247,1207,2338,2471,  # 4854
-1378,4399,2009, 864,1437,1214,4400, 373,3770,1142,2216, 667,4401, 442,2753,2555,  # 4870
-3771,3925,1968,4138,3267,1839, 837, 170,1107, 934,1336,1882,7548,7549,2118,4139,  # 4886
-2828, 743,1569,7550,4402,4140, 582,2384,1418,3437,7551,1802,7552, 357,1395,1729,  # 4902
-3651,3268,2418,1564,2237,7553,3083,3772,1633,4403,1114,2085,4141,1532,7554, 482,  # 4918
-2446,4404,7555,7556,1492, 833,1466,7557,2717,3544,1641,2829,7558,1526,1272,3652,  # 4934
-4142,1686,1794, 416,2556,1902,1953,1803,7559,3773,2785,3774,1159,2316,7560,2867,  # 4950
-4405,1610,1584,3036,2419,2754, 443,3269,1163,3136,7561,7562,3926,7563,4143,2499,  # 4966
-3037,4406,3927,3137,2103,1647,3545,2010,1872,4144,7564,4145, 431,3438,7565, 250,  # 4982
-  97,  81,4146,7566,1648,1850,1558, 160, 848,7567, 866, 740,1694,7568,2201,2830,  # 4998
-3195,4147,4407,3653,1687, 950,2472, 426, 469,3196,3654,3655,3928,7569,7570,1188,  # 5014
- 424,1995, 861,3546,4148,3775,2202,2685, 168,1235,3547,4149,7571,2086,1674,4408,  # 5030
-3337,3270, 220,2557,1009,7572,3776, 670,2992, 332,1208, 717,7573,7574,3548,2447,  # 5046
-3929,3338,7575, 513,7576,1209,2868,3339,3138,4409,1080,7577,7578,7579,7580,2527,  # 5062
-3656,3549, 815,1587,3930,3931,7581,3550,3439,3777,1254,4410,1328,3038,1390,3932,  # 5078
-1741,3933,3778,3934,7582, 236,3779,2448,3271,7583,7584,3657,3780,1273,3781,4411,  # 5094
-7585, 308,7586,4412, 245,4413,1851,2473,1307,2575, 430, 715,2136,2449,7587, 270,  # 5110
- 199,2869,3935,7588,3551,2718,1753, 761,1754, 725,1661,1840,4414,3440,3658,7589,  # 5126
-7590, 587,  14,3272, 227,2598, 326, 480,2265, 943,2755,3552, 291, 650,1883,7591,  # 5142
-1702,1226, 102,1547,  62,3441, 904,4415,3442,1164,4150,7592,7593,1224,1548,2756,  # 5158
- 391, 498,1493,7594,1386,1419,7595,2055,1177,4416, 813, 880,1081,2363, 566,1145,  # 5174
-4417,2286,1001,1035,2558,2599,2238, 394,1286,7596,7597,2068,7598,  86,1494,1730,  # 5190
-3936, 491,1588, 745, 897,2948, 843,3340,3937,2757,2870,3273,1768, 998,2217,2069,  # 5206
- 397,1826,1195,1969,3659,2993,3341, 284,7599,3782,2500,2137,2119,1903,7600,3938,  # 5222
-2150,3939,4151,1036,3443,1904, 114,2559,4152, 209,1527,7601,7602,2949,2831,2625,  # 5238
-2385,2719,3139, 812,2560,7603,3274,7604,1559, 737,1884,3660,1210, 885,  28,2686,  # 5254
-3553,3783,7605,4153,1004,1779,4418,7606, 346,1981,2218,2687,4419,3784,1742, 797,  # 5270
-1642,3940,1933,1072,1384,2151, 896,3941,3275,3661,3197,2871,3554,7607,2561,1958,  # 5286
-4420,2450,1785,7608,7609,7610,3942,4154,1005,1308,3662,4155,2720,4421,4422,1528,  # 5302
-2600, 161,1178,4156,1982, 987,4423,1101,4157, 631,3943,1157,3198,2420,1343,1241,  # 5318
-1016,2239,2562, 372, 877,2339,2501,1160, 555,1934, 911,3944,7611, 466,1170, 169,  # 5334
-1051,2907,2688,3663,2474,2994,1182,2011,2563,1251,2626,7612, 992,2340,3444,1540,  # 5350
-2721,1201,2070,2401,1996,2475,7613,4424, 528,1922,2188,1503,1873,1570,2364,3342,  # 5366
-3276,7614, 557,1073,7615,1827,3445,2087,2266,3140,3039,3084, 767,3085,2786,4425,  # 5382
-1006,4158,4426,2341,1267,2176,3664,3199, 778,3945,3200,2722,1597,2657,7616,4427,  # 5398
-7617,3446,7618,7619,7620,3277,2689,1433,3278, 131,  95,1504,3946, 723,4159,3141,  # 5414
-1841,3555,2758,2189,3947,2027,2104,3665,7621,2995,3948,1218,7622,3343,3201,3949,  # 5430
-4160,2576, 248,1634,3785, 912,7623,2832,3666,3040,3786, 654,  53,7624,2996,7625,  # 5446
-1688,4428, 777,3447,1032,3950,1425,7626, 191, 820,2120,2833, 971,4429, 931,3202,  # 5462
- 135, 664, 783,3787,1997, 772,2908,1935,3951,3788,4430,2909,3203, 282,2723, 640,  # 5478
-1372,3448,1127, 922, 325,3344,7627,7628, 711,2044,7629,7630,3952,2219,2787,1936,  # 5494
-3953,3345,2220,2251,3789,2300,7631,4431,3790,1258,3279,3954,3204,2138,2950,3955,  # 5510
-3956,7632,2221, 258,3205,4432, 101,1227,7633,3280,1755,7634,1391,3281,7635,2910,  # 5526
-2056, 893,7636,7637,7638,1402,4161,2342,7639,7640,3206,3556,7641,7642, 878,1325,  # 5542
-1780,2788,4433, 259,1385,2577, 744,1183,2267,4434,7643,3957,2502,7644, 684,1024,  # 5558
-4162,7645, 472,3557,3449,1165,3282,3958,3959, 322,2152, 881, 455,1695,1152,1340,  # 5574
- 660, 554,2153,4435,1058,4436,4163, 830,1065,3346,3960,4437,1923,7646,1703,1918,  # 5590
-7647, 932,2268, 122,7648,4438, 947, 677,7649,3791,2627, 297,1905,1924,2269,4439,  # 5606
-2317,3283,7650,7651,4164,7652,4165,  84,4166, 112, 989,7653, 547,1059,3961, 701,  # 5622
-3558,1019,7654,4167,7655,3450, 942, 639, 457,2301,2451, 993,2951, 407, 851, 494,  # 5638
-4440,3347, 927,7656,1237,7657,2421,3348, 573,4168, 680, 921,2911,1279,1874, 285,  # 5654
- 790,1448,1983, 719,2167,7658,7659,4441,3962,3963,1649,7660,1541, 563,7661,1077,  # 5670
-7662,3349,3041,3451, 511,2997,3964,3965,3667,3966,1268,2564,3350,3207,4442,4443,  # 5686
-7663, 535,1048,1276,1189,2912,2028,3142,1438,1373,2834,2952,1134,2012,7664,4169,  # 5702
-1238,2578,3086,1259,7665, 700,7666,2953,3143,3668,4170,7667,4171,1146,1875,1906,  # 5718
-4444,2601,3967, 781,2422, 132,1589, 203, 147, 273,2789,2402, 898,1786,2154,3968,  # 5734
-3969,7668,3792,2790,7669,7670,4445,4446,7671,3208,7672,1635,3793, 965,7673,1804,  # 5750
-2690,1516,3559,1121,1082,1329,3284,3970,1449,3794,  65,1128,2835,2913,2759,1590,  # 5766
-3795,7674,7675,  12,2658,  45, 976,2579,3144,4447, 517,2528,1013,1037,3209,7676,  # 5782
-3796,2836,7677,3797,7678,3452,7679,2602, 614,1998,2318,3798,3087,2724,2628,7680,  # 5798
-2580,4172, 599,1269,7681,1810,3669,7682,2691,3088, 759,1060, 489,1805,3351,3285,  # 5814
-1358,7683,7684,2386,1387,1215,2629,2252, 490,7685,7686,4173,1759,2387,2343,7687,  # 5830
-4448,3799,1907,3971,2630,1806,3210,4449,3453,3286,2760,2344, 874,7688,7689,3454,  # 5846
-3670,1858,  91,2914,3671,3042,3800,4450,7690,3145,3972,2659,7691,3455,1202,1403,  # 5862
-3801,2954,2529,1517,2503,4451,3456,2504,7692,4452,7693,2692,1885,1495,1731,3973,  # 5878
-2365,4453,7694,2029,7695,7696,3974,2693,1216, 237,2581,4174,2319,3975,3802,4454,  # 5894
-4455,2694,3560,3457, 445,4456,7697,7698,7699,7700,2761,  61,3976,3672,1822,3977,  # 5910
-7701, 687,2045, 935, 925, 405,2660, 703,1096,1859,2725,4457,3978,1876,1367,2695,  # 5926
-3352, 918,2105,1781,2476, 334,3287,1611,1093,4458, 564,3146,3458,3673,3353, 945,  # 5942
-2631,2057,4459,7702,1925, 872,4175,7703,3459,2696,3089, 349,4176,3674,3979,4460,  # 5958
-3803,4177,3675,2155,3980,4461,4462,4178,4463,2403,2046, 782,3981, 400, 251,4179,  # 5974
-1624,7704,7705, 277,3676, 299,1265, 476,1191,3804,2121,4180,4181,1109, 205,7706,  # 5990
-2582,1000,2156,3561,1860,7707,7708,7709,4464,7710,4465,2565, 107,2477,2157,3982,  # 6006
-3460,3147,7711,1533, 541,1301, 158, 753,4182,2872,3562,7712,1696, 370,1088,4183,  # 6022
-4466,3563, 579, 327, 440, 162,2240, 269,1937,1374,3461, 968,3043,  56,1396,3090,  # 6038
-2106,3288,3354,7713,1926,2158,4467,2998,7714,3564,7715,7716,3677,4468,2478,7717,  # 6054
-2791,7718,1650,4469,7719,2603,7720,7721,3983,2661,3355,1149,3356,3984,3805,3985,  # 6070
-7722,1076,  49,7723, 951,3211,3289,3290, 450,2837, 920,7724,1811,2792,2366,4184,  # 6086
-1908,1138,2367,3806,3462,7725,3212,4470,1909,1147,1518,2423,4471,3807,7726,4472,  # 6102
-2388,2604, 260,1795,3213,7727,7728,3808,3291, 708,7729,3565,1704,7730,3566,1351,  # 6118
-1618,3357,2999,1886, 944,4185,3358,4186,3044,3359,4187,7731,3678, 422, 413,1714,  # 6134
-3292, 500,2058,2345,4188,2479,7732,1344,1910, 954,7733,1668,7734,7735,3986,2404,  # 6150
-4189,3567,3809,4190,7736,2302,1318,2505,3091, 133,3092,2873,4473, 629,  31,2838,  # 6166
-2697,3810,4474, 850, 949,4475,3987,2955,1732,2088,4191,1496,1852,7737,3988, 620,  # 6182
-3214, 981,1242,3679,3360,1619,3680,1643,3293,2139,2452,1970,1719,3463,2168,7738,  # 6198
-3215,7739,7740,3361,1828,7741,1277,4476,1565,2047,7742,1636,3568,3093,7743, 869,  # 6214
-2839, 655,3811,3812,3094,3989,3000,3813,1310,3569,4477,7744,7745,7746,1733, 558,  # 6230
-4478,3681, 335,1549,3045,1756,4192,3682,1945,3464,1829,1291,1192, 470,2726,2107,  # 6246
-2793, 913,1054,3990,7747,1027,7748,3046,3991,4479, 982,2662,3362,3148,3465,3216,  # 6262
-3217,1946,2794,7749, 571,4480,7750,1830,7751,3570,2583,1523,2424,7752,2089, 984,  # 6278
-4481,3683,1959,7753,3684, 852, 923,2795,3466,3685, 969,1519, 999,2048,2320,1705,  # 6294
-7754,3095, 615,1662, 151, 597,3992,2405,2321,1049, 275,4482,3686,4193, 568,3687,  # 6310
-3571,2480,4194,3688,7755,2425,2270, 409,3218,7756,1566,2874,3467,1002, 769,2840,  # 6326
- 194,2090,3149,3689,2222,3294,4195, 628,1505,7757,7758,1763,2177,3001,3993, 521,  # 6342
-1161,2584,1787,2203,2406,4483,3994,1625,4196,4197, 412,  42,3096, 464,7759,2632,  # 6358
-4484,3363,1760,1571,2875,3468,2530,1219,2204,3814,2633,2140,2368,4485,4486,3295,  # 6374
-1651,3364,3572,7760,7761,3573,2481,3469,7762,3690,7763,7764,2271,2091, 460,7765,  # 6390
-4487,7766,3002, 962, 588,3574, 289,3219,2634,1116,  52,7767,3047,1796,7768,7769,  # 6406
-7770,1467,7771,1598,1143,3691,4198,1984,1734,1067,4488,1280,3365, 465,4489,1572,  # 6422
- 510,7772,1927,2241,1812,1644,3575,7773,4490,3692,7774,7775,2663,1573,1534,7776,  # 6438
-7777,4199, 536,1807,1761,3470,3815,3150,2635,7778,7779,7780,4491,3471,2915,1911,  # 6454
-2796,7781,3296,1122, 377,3220,7782, 360,7783,7784,4200,1529, 551,7785,2059,3693,  # 6470
-1769,2426,7786,2916,4201,3297,3097,2322,2108,2030,4492,1404, 136,1468,1479, 672,  # 6486
-1171,3221,2303, 271,3151,7787,2762,7788,2049, 678,2727, 865,1947,4493,7789,2013,  # 6502
-3995,2956,7790,2728,2223,1397,3048,3694,4494,4495,1735,2917,3366,3576,7791,3816,  # 6518
- 509,2841,2453,2876,3817,7792,7793,3152,3153,4496,4202,2531,4497,2304,1166,1010,  # 6534
- 552, 681,1887,7794,7795,2957,2958,3996,1287,1596,1861,3154, 358, 453, 736, 175,  # 6550
- 478,1117, 905,1167,1097,7796,1853,1530,7797,1706,7798,2178,3472,2287,3695,3473,  # 6566
-3577,4203,2092,4204,7799,3367,1193,2482,4205,1458,2190,2205,1862,1888,1421,3298,  # 6582
-2918,3049,2179,3474, 595,2122,7800,3997,7801,7802,4206,1707,2636, 223,3696,1359,  # 6598
- 751,3098, 183,3475,7803,2797,3003, 419,2369, 633, 704,3818,2389, 241,7804,7805,  # 6614
-7806, 838,3004,3697,2272,2763,2454,3819,1938,2050,3998,1309,3099,2242,1181,7807,  # 6630
-1136,2206,3820,2370,1446,4207,2305,4498,7808,7809,4208,1055,2605, 484,3698,7810,  # 6646
-3999, 625,4209,2273,3368,1499,4210,4000,7811,4001,4211,3222,2274,2275,3476,7812,  # 6662
-7813,2764, 808,2606,3699,3369,4002,4212,3100,2532, 526,3370,3821,4213, 955,7814,  # 6678
-1620,4214,2637,2427,7815,1429,3700,1669,1831, 994, 928,7816,3578,1260,7817,7818,  # 6694
-7819,1948,2288, 741,2919,1626,4215,2729,2455, 867,1184, 362,3371,1392,7820,7821,  # 6710
-4003,4216,1770,1736,3223,2920,4499,4500,1928,2698,1459,1158,7822,3050,3372,2877,  # 6726
-1292,1929,2506,2842,3701,1985,1187,2071,2014,2607,4217,7823,2566,2507,2169,3702,  # 6742
-2483,3299,7824,3703,4501,7825,7826, 666,1003,3005,1022,3579,4218,7827,4502,1813,  # 6758
-2253, 574,3822,1603, 295,1535, 705,3823,4219, 283, 858, 417,7828,7829,3224,4503,  # 6774
-4504,3051,1220,1889,1046,2276,2456,4004,1393,1599, 689,2567, 388,4220,7830,2484,  # 6790
- 802,7831,2798,3824,2060,1405,2254,7832,4505,3825,2109,1052,1345,3225,1585,7833,  # 6806
- 809,7834,7835,7836, 575,2730,3477, 956,1552,1469,1144,2323,7837,2324,1560,2457,  # 6822
-3580,3226,4005, 616,2207,3155,2180,2289,7838,1832,7839,3478,4506,7840,1319,3704,  # 6838
-3705,1211,3581,1023,3227,1293,2799,7841,7842,7843,3826, 607,2306,3827, 762,2878,  # 6854
-1439,4221,1360,7844,1485,3052,7845,4507,1038,4222,1450,2061,2638,4223,1379,4508,  # 6870
-2585,7846,7847,4224,1352,1414,2325,2921,1172,7848,7849,3828,3829,7850,1797,1451,  # 6886
-7851,7852,7853,7854,2922,4006,4007,2485,2346, 411,4008,4009,3582,3300,3101,4509,  # 6902
-1561,2664,1452,4010,1375,7855,7856,  47,2959, 316,7857,1406,1591,2923,3156,7858,  # 6918
-1025,2141,3102,3157, 354,2731, 884,2224,4225,2407, 508,3706, 726,3583, 996,2428,  # 6934
-3584, 729,7859, 392,2191,1453,4011,4510,3707,7860,7861,2458,3585,2608,1675,2800,  # 6950
- 919,2347,2960,2348,1270,4511,4012,  73,7862,7863, 647,7864,3228,2843,2255,1550,  # 6966
-1346,3006,7865,1332, 883,3479,7866,7867,7868,7869,3301,2765,7870,1212, 831,1347,  # 6982
-4226,4512,2326,3830,1863,3053, 720,3831,4513,4514,3832,7871,4227,7872,7873,4515,  # 6998
-7874,7875,1798,4516,3708,2609,4517,3586,1645,2371,7876,7877,2924, 669,2208,2665,  # 7014
-2429,7878,2879,7879,7880,1028,3229,7881,4228,2408,7882,2256,1353,7883,7884,4518,  # 7030
-3158, 518,7885,4013,7886,4229,1960,7887,2142,4230,7888,7889,3007,2349,2350,3833,  # 7046
- 516,1833,1454,4014,2699,4231,4519,2225,2610,1971,1129,3587,7890,2766,7891,2961,  # 7062
-1422, 577,1470,3008,1524,3373,7892,7893, 432,4232,3054,3480,7894,2586,1455,2508,  # 7078
-2226,1972,1175,7895,1020,2732,4015,3481,4520,7896,2733,7897,1743,1361,3055,3482,  # 7094
-2639,4016,4233,4521,2290, 895, 924,4234,2170, 331,2243,3056, 166,1627,3057,1098,  # 7110
-7898,1232,2880,2227,3374,4522, 657, 403,1196,2372, 542,3709,3375,1600,4235,3483,  # 7126
-7899,4523,2767,3230, 576, 530,1362,7900,4524,2533,2666,3710,4017,7901, 842,3834,  # 7142
-7902,2801,2031,1014,4018, 213,2700,3376, 665, 621,4236,7903,3711,2925,2430,7904,  # 7158
-2431,3302,3588,3377,7905,4237,2534,4238,4525,3589,1682,4239,3484,1380,7906, 724,  # 7174
-2277, 600,1670,7907,1337,1233,4526,3103,2244,7908,1621,4527,7909, 651,4240,7910,  # 7190
-1612,4241,2611,7911,2844,7912,2734,2307,3058,7913, 716,2459,3059, 174,1255,2701,  # 7206
-4019,3590, 548,1320,1398, 728,4020,1574,7914,1890,1197,3060,4021,7915,3061,3062,  # 7222
-3712,3591,3713, 747,7916, 635,4242,4528,7917,7918,7919,4243,7920,7921,4529,7922,  # 7238
-3378,4530,2432, 451,7923,3714,2535,2072,4244,2735,4245,4022,7924,1764,4531,7925,  # 7254
-4246, 350,7926,2278,2390,2486,7927,4247,4023,2245,1434,4024, 488,4532, 458,4248,  # 7270
-4025,3715, 771,1330,2391,3835,2568,3159,2159,2409,1553,2667,3160,4249,7928,2487,  # 7286
-2881,2612,1720,2702,4250,3379,4533,7929,2536,4251,7930,3231,4252,2768,7931,2015,  # 7302
-2736,7932,1155,1017,3716,3836,7933,3303,2308, 201,1864,4253,1430,7934,4026,7935,  # 7318
-7936,7937,7938,7939,4254,1604,7940, 414,1865, 371,2587,4534,4535,3485,2016,3104,  # 7334
-4536,1708, 960,4255, 887, 389,2171,1536,1663,1721,7941,2228,4027,2351,2926,1580,  # 7350
-7942,7943,7944,1744,7945,2537,4537,4538,7946,4539,7947,2073,7948,7949,3592,3380,  # 7366
-2882,4256,7950,4257,2640,3381,2802, 673,2703,2460, 709,3486,4028,3593,4258,7951,  # 7382
-1148, 502, 634,7952,7953,1204,4540,3594,1575,4541,2613,3717,7954,3718,3105, 948,  # 7398
-3232, 121,1745,3837,1110,7955,4259,3063,2509,3009,4029,3719,1151,1771,3838,1488,  # 7414
-4030,1986,7956,2433,3487,7957,7958,2093,7959,4260,3839,1213,1407,2803, 531,2737,  # 7430
-2538,3233,1011,1537,7960,2769,4261,3106,1061,7961,3720,3721,1866,2883,7962,2017,  # 7446
- 120,4262,4263,2062,3595,3234,2309,3840,2668,3382,1954,4542,7963,7964,3488,1047,  # 7462
-2704,1266,7965,1368,4543,2845, 649,3383,3841,2539,2738,1102,2846,2669,7966,7967,  # 7478
-1999,7968,1111,3596,2962,7969,2488,3842,3597,2804,1854,3384,3722,7970,7971,3385,  # 7494
-2410,2884,3304,3235,3598,7972,2569,7973,3599,2805,4031,1460, 856,7974,3600,7975,  # 7510
-2885,2963,7976,2886,3843,7977,4264, 632,2510, 875,3844,1697,3845,2291,7978,7979,  # 7526
-4544,3010,1239, 580,4545,4265,7980, 914, 936,2074,1190,4032,1039,2123,7981,7982,  # 7542
-7983,3386,1473,7984,1354,4266,3846,7985,2172,3064,4033, 915,3305,4267,4268,3306,  # 7558
-1605,1834,7986,2739, 398,3601,4269,3847,4034, 328,1912,2847,4035,3848,1331,4270,  # 7574
-3011, 937,4271,7987,3602,4036,4037,3387,2160,4546,3388, 524, 742, 538,3065,1012,  # 7590
-7988,7989,3849,2461,7990, 658,1103, 225,3850,7991,7992,4547,7993,4548,7994,3236,  # 7606
-1243,7995,4038, 963,2246,4549,7996,2705,3603,3161,7997,7998,2588,2327,7999,4550,  # 7622
-8000,8001,8002,3489,3307, 957,3389,2540,2032,1930,2927,2462, 870,2018,3604,1746,  # 7638
-2770,2771,2434,2463,8003,3851,8004,3723,3107,3724,3490,3390,3725,8005,1179,3066,  # 7654
-8006,3162,2373,4272,3726,2541,3163,3108,2740,4039,8007,3391,1556,2542,2292, 977,  # 7670
-2887,2033,4040,1205,3392,8008,1765,3393,3164,2124,1271,1689, 714,4551,3491,8009,  # 7686
-2328,3852, 533,4273,3605,2181, 617,8010,2464,3308,3492,2310,8011,8012,3165,8013,  # 7702
-8014,3853,1987, 618, 427,2641,3493,3394,8015,8016,1244,1690,8017,2806,4274,4552,  # 7718
-8018,3494,8019,8020,2279,1576, 473,3606,4275,3395, 972,8021,3607,8022,3067,8023,  # 7734
-8024,4553,4554,8025,3727,4041,4042,8026, 153,4555, 356,8027,1891,2888,4276,2143,  # 7750
- 408, 803,2352,8028,3854,8029,4277,1646,2570,2511,4556,4557,3855,8030,3856,4278,  # 7766
-8031,2411,3396, 752,8032,8033,1961,2964,8034, 746,3012,2465,8035,4279,3728, 698,  # 7782
-4558,1892,4280,3608,2543,4559,3609,3857,8036,3166,3397,8037,1823,1302,4043,2706,  # 7798
-3858,1973,4281,8038,4282,3167, 823,1303,1288,1236,2848,3495,4044,3398, 774,3859,  # 7814
-8039,1581,4560,1304,2849,3860,4561,8040,2435,2161,1083,3237,4283,4045,4284, 344,  # 7830
-1173, 288,2311, 454,1683,8041,8042,1461,4562,4046,2589,8043,8044,4563, 985, 894,  # 7846
-8045,3399,3168,8046,1913,2928,3729,1988,8047,2110,1974,8048,4047,8049,2571,1194,  # 7862
- 425,8050,4564,3169,1245,3730,4285,8051,8052,2850,8053, 636,4565,1855,3861, 760,  # 7878
-1799,8054,4286,2209,1508,4566,4048,1893,1684,2293,8055,8056,8057,4287,4288,2210,  # 7894
- 479,8058,8059, 832,8060,4049,2489,8061,2965,2490,3731, 990,3109, 627,1814,2642,  # 7910
-4289,1582,4290,2125,2111,3496,4567,8062, 799,4291,3170,8063,4568,2112,1737,3013,  # 7926
-1018, 543, 754,4292,3309,1676,4569,4570,4050,8064,1489,8065,3497,8066,2614,2889,  # 7942
-4051,8067,8068,2966,8069,8070,8071,8072,3171,4571,4572,2182,1722,8073,3238,3239,  # 7958
-1842,3610,1715, 481, 365,1975,1856,8074,8075,1962,2491,4573,8076,2126,3611,3240,  # 7974
- 433,1894,2063,2075,8077, 602,2741,8078,8079,8080,8081,8082,3014,1628,3400,8083,  # 7990
-3172,4574,4052,2890,4575,2512,8084,2544,2772,8085,8086,8087,3310,4576,2891,8088,  # 8006
-4577,8089,2851,4578,4579,1221,2967,4053,2513,8090,8091,8092,1867,1989,8093,8094,  # 8022
-8095,1895,8096,8097,4580,1896,4054, 318,8098,2094,4055,4293,8099,8100, 485,8101,  # 8038
- 938,3862, 553,2670, 116,8102,3863,3612,8103,3498,2671,2773,3401,3311,2807,8104,  # 8054
-3613,2929,4056,1747,2930,2968,8105,8106, 207,8107,8108,2672,4581,2514,8109,3015,  # 8070
- 890,3614,3864,8110,1877,3732,3402,8111,2183,2353,3403,1652,8112,8113,8114, 941,  # 8086
-2294, 208,3499,4057,2019, 330,4294,3865,2892,2492,3733,4295,8115,8116,8117,8118,  # 8102
-)
-
diff --git a/lib/sub_repos/chardet/chardet/euctwprober.py b/lib/sub_repos/chardet/chardet/euctwprober.py
deleted file mode 100644
index 35669cc4d..000000000
--- a/lib/sub_repos/chardet/chardet/euctwprober.py
+++ /dev/null
@@ -1,46 +0,0 @@
-######################## BEGIN LICENSE BLOCK ########################
-# The Original Code is mozilla.org code.
-#
-# The Initial Developer of the Original Code is
-# Netscape Communications Corporation.
-# Portions created by the Initial Developer are Copyright (C) 1998
-# the Initial Developer. All Rights Reserved.
-#
-# Contributor(s):
-#   Mark Pilgrim - port to Python
-#
-# This library is free software; you can redistribute it and/or
-# modify it under the terms of the GNU Lesser General Public
-# License as published by the Free Software Foundation; either
-# version 2.1 of the License, or (at your option) any later version.
-#
-# This library is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-# Lesser General Public License for more details.
-#
-# You should have received a copy of the GNU Lesser General Public
-# License along with this library; if not, write to the Free Software
-# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
-# 02110-1301  USA
-######################### END LICENSE BLOCK #########################
-
-from .mbcharsetprober import MultiByteCharSetProber
-from .codingstatemachine import CodingStateMachine
-from .chardistribution import EUCTWDistributionAnalysis
-from .mbcssm import EUCTW_SM_MODEL
-
-class EUCTWProber(MultiByteCharSetProber):
-    def __init__(self):
-        super(EUCTWProber, self).__init__()
-        self.coding_sm = CodingStateMachine(EUCTW_SM_MODEL)
-        self.distribution_analyzer = EUCTWDistributionAnalysis()
-        self.reset()
-
-    @property
-    def charset_name(self):
-        return "EUC-TW"
-
-    @property
-    def language(self):
-        return "Taiwan"
diff --git a/lib/sub_repos/chardet/chardet/gb2312freq.py b/lib/sub_repos/chardet/chardet/gb2312freq.py
deleted file mode 100644
index 697837bd9..000000000
--- a/lib/sub_repos/chardet/chardet/gb2312freq.py
+++ /dev/null
@@ -1,283 +0,0 @@
-######################## BEGIN LICENSE BLOCK ########################
-# The Original Code is Mozilla Communicator client code.
-#
-# The Initial Developer of the Original Code is
-# Netscape Communications Corporation.
-# Portions created by the Initial Developer are Copyright (C) 1998
-# the Initial Developer. All Rights Reserved.
-#
-# Contributor(s):
-#   Mark Pilgrim - port to Python
-#
-# This library is free software; you can redistribute it and/or
-# modify it under the terms of the GNU Lesser General Public
-# License as published by the Free Software Foundation; either
-# version 2.1 of the License, or (at your option) any later version.
-#
-# This library is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-# Lesser General Public License for more details.
-#
-# You should have received a copy of the GNU Lesser General Public
-# License along with this library; if not, write to the Free Software
-# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
-# 02110-1301  USA
-######################### END LICENSE BLOCK #########################
-
-# GB2312 most frequently used character table
-#
-# Char to FreqOrder table , from hz6763
-
-# 512  --> 0.79  -- 0.79
-# 1024 --> 0.92  -- 0.13
-# 2048 --> 0.98  -- 0.06
-# 6768 --> 1.00  -- 0.02
-#
-# Ideal Distribution Ratio = 0.79135/(1-0.79135) = 3.79
-# Random Distribution Ration = 512 / (3755 - 512) = 0.157
-#
-# Typical Distribution Ratio about 25% of Ideal one, still much higher that RDR
-
-GB2312_TYPICAL_DISTRIBUTION_RATIO = 0.9
-
-GB2312_TABLE_SIZE = 3760
-
-GB2312_CHAR_TO_FREQ_ORDER = (
-1671, 749,1443,2364,3924,3807,2330,3921,1704,3463,2691,1511,1515, 572,3191,2205,
-2361, 224,2558, 479,1711, 963,3162, 440,4060,1905,2966,2947,3580,2647,3961,3842,
-2204, 869,4207, 970,2678,5626,2944,2956,1479,4048, 514,3595, 588,1346,2820,3409,
- 249,4088,1746,1873,2047,1774, 581,1813, 358,1174,3590,1014,1561,4844,2245, 670,
-1636,3112, 889,1286, 953, 556,2327,3060,1290,3141, 613, 185,3477,1367, 850,3820,
-1715,2428,2642,2303,2732,3041,2562,2648,3566,3946,1349, 388,3098,2091,1360,3585,
- 152,1687,1539, 738,1559,  59,1232,2925,2267,1388,1249,1741,1679,2960, 151,1566,
-1125,1352,4271, 924,4296, 385,3166,4459, 310,1245,2850,  70,3285,2729,3534,3575,
-2398,3298,3466,1960,2265, 217,3647, 864,1909,2084,4401,2773,1010,3269,5152, 853,
-3051,3121,1244,4251,1895, 364,1499,1540,2313,1180,3655,2268, 562, 715,2417,3061,
- 544, 336,3768,2380,1752,4075, 950, 280,2425,4382, 183,2759,3272, 333,4297,2155,
-1688,2356,1444,1039,4540, 736,1177,3349,2443,2368,2144,2225, 565, 196,1482,3406,
- 927,1335,4147, 692, 878,1311,1653,3911,3622,1378,4200,1840,2969,3149,2126,1816,
-2534,1546,2393,2760, 737,2494,  13, 447, 245,2747,  38,2765,2129,2589,1079, 606,
- 360, 471,3755,2890, 404, 848, 699,1785,1236, 370,2221,1023,3746,2074,2026,2023,
-2388,1581,2119, 812,1141,3091,2536,1519, 804,2053, 406,1596,1090, 784, 548,4414,
-1806,2264,2936,1100, 343,4114,5096, 622,3358, 743,3668,1510,1626,5020,3567,2513,
-3195,4115,5627,2489,2991,  24,2065,2697,1087,2719,  48,1634, 315,  68, 985,2052,
- 198,2239,1347,1107,1439, 597,2366,2172, 871,3307, 919,2487,2790,1867, 236,2570,
-1413,3794, 906,3365,3381,1701,1982,1818,1524,2924,1205, 616,2586,2072,2004, 575,
- 253,3099,  32,1365,1182, 197,1714,2454,1201, 554,3388,3224,2748, 756,2587, 250,
-2567,1507,1517,3529,1922,2761,2337,3416,1961,1677,2452,2238,3153, 615, 911,1506,
-1474,2495,1265,1906,2749,3756,3280,2161, 898,2714,1759,3450,2243,2444, 563,  26,
-3286,2266,3769,3344,2707,3677, 611,1402, 531,1028,2871,4548,1375, 261,2948, 835,
-1190,4134, 353, 840,2684,1900,3082,1435,2109,1207,1674, 329,1872,2781,4055,2686,
-2104, 608,3318,2423,2957,2768,1108,3739,3512,3271,3985,2203,1771,3520,1418,2054,
-1681,1153, 225,1627,2929, 162,2050,2511,3687,1954, 124,1859,2431,1684,3032,2894,
- 585,4805,3969,2869,2704,2088,2032,2095,3656,2635,4362,2209, 256, 518,2042,2105,
-3777,3657, 643,2298,1148,1779, 190, 989,3544, 414,  11,2135,2063,2979,1471, 403,
-3678, 126, 770,1563, 671,2499,3216,2877, 600,1179, 307,2805,4937,1268,1297,2694,
- 252,4032,1448,1494,1331,1394, 127,2256, 222,1647,1035,1481,3056,1915,1048, 873,
-3651, 210,  33,1608,2516, 200,1520, 415, 102,   0,3389,1287, 817,  91,3299,2940,
- 836,1814, 549,2197,1396,1669,2987,3582,2297,2848,4528,1070, 687,  20,1819, 121,
-1552,1364,1461,1968,2617,3540,2824,2083, 177, 948,4938,2291, 110,4549,2066, 648,
-3359,1755,2110,2114,4642,4845,1693,3937,3308,1257,1869,2123, 208,1804,3159,2992,
-2531,2549,3361,2418,1350,2347,2800,2568,1291,2036,2680,  72, 842,1990, 212,1233,
-1154,1586,  75,2027,3410,4900,1823,1337,2710,2676, 728,2810,1522,3026,4995, 157,
- 755,1050,4022, 710, 785,1936,2194,2085,1406,2777,2400, 150,1250,4049,1206, 807,
-1910, 534, 529,3309,1721,1660, 274,  39,2827, 661,2670,1578, 925,3248,3815,1094,
-4278,4901,4252,  41,1150,3747,2572,2227,4501,3658,4902,3813,3357,3617,2884,2258,
- 887, 538,4187,3199,1294,2439,3042,2329,2343,2497,1255, 107, 543,1527, 521,3478,
-3568, 194,5062,  15, 961,3870,1241,1192,2664,  66,5215,3260,2111,1295,1127,2152,
-3805,4135, 901,1164,1976, 398,1278, 530,1460, 748, 904,1054,1966,1426,  53,2909,
- 509, 523,2279,1534, 536,1019, 239,1685, 460,2353, 673,1065,2401,3600,4298,2272,
-1272,2363, 284,1753,3679,4064,1695,  81, 815,2677,2757,2731,1386, 859, 500,4221,
-2190,2566, 757,1006,2519,2068,1166,1455, 337,2654,3203,1863,1682,1914,3025,1252,
-1409,1366, 847, 714,2834,2038,3209, 964,2970,1901, 885,2553,1078,1756,3049, 301,
-1572,3326, 688,2130,1996,2429,1805,1648,2930,3421,2750,3652,3088, 262,1158,1254,
- 389,1641,1812, 526,1719, 923,2073,1073,1902, 468, 489,4625,1140, 857,2375,3070,
-3319,2863, 380, 116,1328,2693,1161,2244, 273,1212,1884,2769,3011,1775,1142, 461,
-3066,1200,2147,2212, 790, 702,2695,4222,1601,1058, 434,2338,5153,3640,  67,2360,
-4099,2502, 618,3472,1329, 416,1132, 830,2782,1807,2653,3211,3510,1662, 192,2124,
- 296,3979,1739,1611,3684,  23, 118, 324, 446,1239,1225, 293,2520,3814,3795,2535,
-3116,  17,1074, 467,2692,2201, 387,2922,  45,1326,3055,1645,3659,2817, 958, 243,
-1903,2320,1339,2825,1784,3289, 356, 576, 865,2315,2381,3377,3916,1088,3122,1713,
-1655, 935, 628,4689,1034,1327, 441, 800, 720, 894,1979,2183,1528,5289,2702,1071,
-4046,3572,2399,1571,3281,  79, 761,1103, 327, 134, 758,1899,1371,1615, 879, 442,
- 215,2605,2579, 173,2048,2485,1057,2975,3317,1097,2253,3801,4263,1403,1650,2946,
- 814,4968,3487,1548,2644,1567,1285,   2, 295,2636,  97, 946,3576, 832, 141,4257,
-3273, 760,3821,3521,3156,2607, 949,1024,1733,1516,1803,1920,2125,2283,2665,3180,
-1501,2064,3560,2171,1592, 803,3518,1416, 732,3897,4258,1363,1362,2458, 119,1427,
- 602,1525,2608,1605,1639,3175, 694,3064,  10, 465,  76,2000,4846,4208, 444,3781,
-1619,3353,2206,1273,3796, 740,2483, 320,1723,2377,3660,2619,1359,1137,1762,1724,
-2345,2842,1850,1862, 912, 821,1866, 612,2625,1735,2573,3369,1093, 844,  89, 937,
- 930,1424,3564,2413,2972,1004,3046,3019,2011, 711,3171,1452,4178, 428, 801,1943,
- 432, 445,2811, 206,4136,1472, 730, 349,  73, 397,2802,2547, 998,1637,1167, 789,
- 396,3217, 154,1218, 716,1120,1780,2819,4826,1931,3334,3762,2139,1215,2627, 552,
-3664,3628,3232,1405,2383,3111,1356,2652,3577,3320,3101,1703, 640,1045,1370,1246,
-4996, 371,1575,2436,1621,2210, 984,4033,1734,2638,  16,4529, 663,2755,3255,1451,
-3917,2257,1253,1955,2234,1263,2951, 214,1229, 617, 485, 359,1831,1969, 473,2310,
- 750,2058, 165,  80,2864,2419, 361,4344,2416,2479,1134, 796,3726,1266,2943, 860,
-2715, 938, 390,2734,1313,1384, 248, 202, 877,1064,2854, 522,3907, 279,1602, 297,
-2357, 395,3740, 137,2075, 944,4089,2584,1267,3802,  62,1533,2285, 178, 176, 780,
-2440, 201,3707, 590, 478,1560,4354,2117,1075,  30,  74,4643,4004,1635,1441,2745,
- 776,2596, 238,1077,1692,1912,2844, 605, 499,1742,3947, 241,3053, 980,1749, 936,
-2640,4511,2582, 515,1543,2162,5322,2892,2993, 890,2148,1924, 665,1827,3581,1032,
- 968,3163, 339,1044,1896, 270, 583,1791,1720,4367,1194,3488,3669,  43,2523,1657,
- 163,2167, 290,1209,1622,3378, 550, 634,2508,2510, 695,2634,2384,2512,1476,1414,
- 220,1469,2341,2138,2852,3183,2900,4939,2865,3502,1211,3680, 854,3227,1299,2976,
-3172, 186,2998,1459, 443,1067,3251,1495, 321,1932,3054, 909, 753,1410,1828, 436,
-2441,1119,1587,3164,2186,1258, 227, 231,1425,1890,3200,3942, 247, 959, 725,5254,
-2741, 577,2158,2079, 929, 120, 174, 838,2813, 591,1115, 417,2024,  40,3240,1536,
-1037, 291,4151,2354, 632,1298,2406,2500,3535,1825,1846,3451, 205,1171, 345,4238,
-  18,1163, 811, 685,2208,1217, 425,1312,1508,1175,4308,2552,1033, 587,1381,3059,
-2984,3482, 340,1316,4023,3972, 792,3176, 519, 777,4690, 918, 933,4130,2981,3741,
-  90,3360,2911,2200,5184,4550, 609,3079,2030, 272,3379,2736, 363,3881,1130,1447,
- 286, 779, 357,1169,3350,3137,1630,1220,2687,2391, 747,1277,3688,2618,2682,2601,
-1156,3196,5290,4034,3102,1689,3596,3128, 874, 219,2783, 798, 508,1843,2461, 269,
-1658,1776,1392,1913,2983,3287,2866,2159,2372, 829,4076,  46,4253,2873,1889,1894,
- 915,1834,1631,2181,2318, 298, 664,2818,3555,2735, 954,3228,3117, 527,3511,2173,
- 681,2712,3033,2247,2346,3467,1652, 155,2164,3382, 113,1994, 450, 899, 494, 994,
-1237,2958,1875,2336,1926,3727, 545,1577,1550, 633,3473, 204,1305,3072,2410,1956,
-2471, 707,2134, 841,2195,2196,2663,3843,1026,4940, 990,3252,4997, 368,1092, 437,
-3212,3258,1933,1829, 675,2977,2893, 412, 943,3723,4644,3294,3283,2230,2373,5154,
-2389,2241,2661,2323,1404,2524, 593, 787, 677,3008,1275,2059, 438,2709,2609,2240,
-2269,2246,1446,  36,1568,1373,3892,1574,2301,1456,3962, 693,2276,5216,2035,1143,
-2720,1919,1797,1811,2763,4137,2597,1830,1699,1488,1198,2090, 424,1694, 312,3634,
-3390,4179,3335,2252,1214, 561,1059,3243,2295,2561, 975,5155,2321,2751,3772, 472,
-1537,3282,3398,1047,2077,2348,2878,1323,3340,3076, 690,2906,  51, 369, 170,3541,
-1060,2187,2688,3670,2541,1083,1683, 928,3918, 459, 109,4427, 599,3744,4286, 143,
-2101,2730,2490,  82,1588,3036,2121, 281,1860, 477,4035,1238,2812,3020,2716,3312,
-1530,2188,2055,1317, 843, 636,1808,1173,3495, 649, 181,1002, 147,3641,1159,2414,
-3750,2289,2795, 813,3123,2610,1136,4368,   5,3391,4541,2174, 420, 429,1728, 754,
-1228,2115,2219, 347,2223,2733, 735,1518,3003,2355,3134,1764,3948,3329,1888,2424,
-1001,1234,1972,3321,3363,1672,1021,1450,1584, 226, 765, 655,2526,3404,3244,2302,
-3665, 731, 594,2184, 319,1576, 621, 658,2656,4299,2099,3864,1279,2071,2598,2739,
- 795,3086,3699,3908,1707,2352,2402,1382,3136,2475,1465,4847,3496,3865,1085,3004,
-2591,1084, 213,2287,1963,3565,2250, 822, 793,4574,3187,1772,1789,3050, 595,1484,
-1959,2770,1080,2650, 456, 422,2996, 940,3322,4328,4345,3092,2742, 965,2784, 739,
-4124, 952,1358,2498,2949,2565, 332,2698,2378, 660,2260,2473,4194,3856,2919, 535,
-1260,2651,1208,1428,1300,1949,1303,2942, 433,2455,2450,1251,1946, 614,1269, 641,
-1306,1810,2737,3078,2912, 564,2365,1419,1415,1497,4460,2367,2185,1379,3005,1307,
-3218,2175,1897,3063, 682,1157,4040,4005,1712,1160,1941,1399, 394, 402,2952,1573,
-1151,2986,2404, 862, 299,2033,1489,3006, 346, 171,2886,3401,1726,2932, 168,2533,
-  47,2507,1030,3735,1145,3370,1395,1318,1579,3609,4560,2857,4116,1457,2529,1965,
- 504,1036,2690,2988,2405, 745,5871, 849,2397,2056,3081, 863,2359,3857,2096,  99,
-1397,1769,2300,4428,1643,3455,1978,1757,3718,1440,  35,4879,3742,1296,4228,2280,
- 160,5063,1599,2013, 166, 520,3479,1646,3345,3012, 490,1937,1545,1264,2182,2505,
-1096,1188,1369,1436,2421,1667,2792,2460,1270,2122, 727,3167,2143, 806,1706,1012,
-1800,3037, 960,2218,1882, 805, 139,2456,1139,1521, 851,1052,3093,3089, 342,2039,
- 744,5097,1468,1502,1585,2087, 223, 939, 326,2140,2577, 892,2481,1623,4077, 982,
-3708, 135,2131,  87,2503,3114,2326,1106, 876,1616, 547,2997,2831,2093,3441,4530,
-4314,   9,3256,4229,4148, 659,1462,1986,1710,2046,2913,2231,4090,4880,5255,3392,
-3274,1368,3689,4645,1477, 705,3384,3635,1068,1529,2941,1458,3782,1509, 100,1656,
-2548, 718,2339, 408,1590,2780,3548,1838,4117,3719,1345,3530, 717,3442,2778,3220,
-2898,1892,4590,3614,3371,2043,1998,1224,3483, 891, 635, 584,2559,3355, 733,1766,
-1729,1172,3789,1891,2307, 781,2982,2271,1957,1580,5773,2633,2005,4195,3097,1535,
-3213,1189,1934,5693,3262, 586,3118,1324,1598, 517,1564,2217,1868,1893,4445,3728,
-2703,3139,1526,1787,1992,3882,2875,1549,1199,1056,2224,1904,2711,5098,4287, 338,
-1993,3129,3489,2689,1809,2815,1997, 957,1855,3898,2550,3275,3057,1105,1319, 627,
-1505,1911,1883,3526, 698,3629,3456,1833,1431, 746,  77,1261,2017,2296,1977,1885,
- 125,1334,1600, 525,1798,1109,2222,1470,1945, 559,2236,1186,3443,2476,1929,1411,
-2411,3135,1777,3372,2621,1841,1613,3229, 668,1430,1839,2643,2916, 195,1989,2671,
-2358,1387, 629,3205,2293,5256,4439, 123,1310, 888,1879,4300,3021,3605,1003,1162,
-3192,2910,2010, 140,2395,2859,  55,1082,2012,2901, 662, 419,2081,1438, 680,2774,
-4654,3912,1620,1731,1625,5035,4065,2328, 512,1344, 802,5443,2163,2311,2537, 524,
-3399,  98,1155,2103,1918,2606,3925,2816,1393,2465,1504,3773,2177,3963,1478,4346,
- 180,1113,4655,3461,2028,1698, 833,2696,1235,1322,1594,4408,3623,3013,3225,2040,
-3022, 541,2881, 607,3632,2029,1665,1219, 639,1385,1686,1099,2803,3231,1938,3188,
-2858, 427, 676,2772,1168,2025, 454,3253,2486,3556, 230,1950, 580, 791,1991,1280,
-1086,1974,2034, 630, 257,3338,2788,4903,1017,  86,4790, 966,2789,1995,1696,1131,
- 259,3095,4188,1308, 179,1463,5257, 289,4107,1248,  42,3413,1725,2288, 896,1947,
- 774,4474,4254, 604,3430,4264, 392,2514,2588, 452, 237,1408,3018, 988,4531,1970,
-3034,3310, 540,2370,1562,1288,2990, 502,4765,1147,   4,1853,2708, 207, 294,2814,
-4078,2902,2509, 684,  34,3105,3532,2551, 644, 709,2801,2344, 573,1727,3573,3557,
-2021,1081,3100,4315,2100,3681, 199,2263,1837,2385, 146,3484,1195,2776,3949, 997,
-1939,3973,1008,1091,1202,1962,1847,1149,4209,5444,1076, 493, 117,5400,2521, 972,
-1490,2934,1796,4542,2374,1512,2933,2657, 413,2888,1135,2762,2314,2156,1355,2369,
- 766,2007,2527,2170,3124,2491,2593,2632,4757,2437, 234,3125,3591,1898,1750,1376,
-1942,3468,3138, 570,2127,2145,3276,4131, 962, 132,1445,4196,  19, 941,3624,3480,
-3366,1973,1374,4461,3431,2629, 283,2415,2275, 808,2887,3620,2112,2563,1353,3610,
- 955,1089,3103,1053,  96,  88,4097, 823,3808,1583, 399, 292,4091,3313, 421,1128,
- 642,4006, 903,2539,1877,2082, 596,  29,4066,1790, 722,2157, 130, 995,1569, 769,
-1485, 464, 513,2213, 288,1923,1101,2453,4316, 133, 486,2445,  50, 625, 487,2207,
-  57, 423, 481,2962, 159,3729,1558, 491, 303, 482, 501, 240,2837, 112,3648,2392,
-1783, 362,   8,3433,3422, 610,2793,3277,1390,1284,1654,  21,3823, 734, 367, 623,
- 193, 287, 374,1009,1483, 816, 476, 313,2255,2340,1262,2150,2899,1146,2581, 782,
-2116,1659,2018,1880, 255,3586,3314,1110,2867,2137,2564, 986,2767,5185,2006, 650,
- 158, 926, 762, 881,3157,2717,2362,3587, 306,3690,3245,1542,3077,2427,1691,2478,
-2118,2985,3490,2438, 539,2305, 983, 129,1754, 355,4201,2386, 827,2923, 104,1773,
-2838,2771, 411,2905,3919, 376, 767, 122,1114, 828,2422,1817,3506, 266,3460,1007,
-1609,4998, 945,2612,4429,2274, 726,1247,1964,2914,2199,2070,4002,4108, 657,3323,
-1422, 579, 455,2764,4737,1222,2895,1670, 824,1223,1487,2525, 558, 861,3080, 598,
-2659,2515,1967, 752,2583,2376,2214,4180, 977, 704,2464,4999,2622,4109,1210,2961,
- 819,1541, 142,2284,  44, 418, 457,1126,3730,4347,4626,1644,1876,3671,1864, 302,
-1063,5694, 624, 723,1984,3745,1314,1676,2488,1610,1449,3558,3569,2166,2098, 409,
-1011,2325,3704,2306, 818,1732,1383,1824,1844,3757, 999,2705,3497,1216,1423,2683,
-2426,2954,2501,2726,2229,1475,2554,5064,1971,1794,1666,2014,1343, 783, 724, 191,
-2434,1354,2220,5065,1763,2752,2472,4152, 131, 175,2885,3434,  92,1466,4920,2616,
-3871,3872,3866, 128,1551,1632, 669,1854,3682,4691,4125,1230, 188,2973,3290,1302,
-1213, 560,3266, 917, 763,3909,3249,1760, 868,1958, 764,1782,2097, 145,2277,3774,
-4462,  64,1491,3062, 971,2132,3606,2442, 221,1226,1617, 218, 323,1185,3207,3147,
- 571, 619,1473,1005,1744,2281, 449,1887,2396,3685, 275, 375,3816,1743,3844,3731,
- 845,1983,2350,4210,1377, 773, 967,3499,3052,3743,2725,4007,1697,1022,3943,1464,
-3264,2855,2722,1952,1029,2839,2467,  84,4383,2215, 820,1391,2015,2448,3672, 377,
-1948,2168, 797,2545,3536,2578,2645,  94,2874,1678, 405,1259,3071, 771, 546,1315,
- 470,1243,3083, 895,2468, 981, 969,2037, 846,4181, 653,1276,2928,  14,2594, 557,
-3007,2474, 156, 902,1338,1740,2574, 537,2518, 973,2282,2216,2433,1928, 138,2903,
-1293,2631,1612, 646,3457, 839,2935, 111, 496,2191,2847, 589,3186, 149,3994,2060,
-4031,2641,4067,3145,1870,  37,3597,2136,1025,2051,3009,3383,3549,1121,1016,3261,
-1301, 251,2446,2599,2153, 872,3246, 637, 334,3705, 831, 884, 921,3065,3140,4092,
-2198,1944, 246,2964, 108,2045,1152,1921,2308,1031, 203,3173,4170,1907,3890, 810,
-1401,2003,1690, 506, 647,1242,2828,1761,1649,3208,2249,1589,3709,2931,5156,1708,
- 498, 666,2613, 834,3817,1231, 184,2851,1124, 883,3197,2261,3710,1765,1553,2658,
-1178,2639,2351,  93,1193, 942,2538,2141,4402, 235,1821, 870,1591,2192,1709,1871,
-3341,1618,4126,2595,2334, 603, 651,  69, 701, 268,2662,3411,2555,1380,1606, 503,
- 448, 254,2371,2646, 574,1187,2309,1770, 322,2235,1292,1801, 305, 566,1133, 229,
-2067,2057, 706, 167, 483,2002,2672,3295,1820,3561,3067, 316, 378,2746,3452,1112,
- 136,1981, 507,1651,2917,1117, 285,4591, 182,2580,3522,1304, 335,3303,1835,2504,
-1795,1792,2248, 674,1018,2106,2449,1857,2292,2845, 976,3047,1781,2600,2727,1389,
-1281,  52,3152, 153, 265,3950, 672,3485,3951,4463, 430,1183, 365, 278,2169,  27,
-1407,1336,2304, 209,1340,1730,2202,1852,2403,2883, 979,1737,1062, 631,2829,2542,
-3876,2592, 825,2086,2226,3048,3625, 352,1417,3724, 542, 991, 431,1351,3938,1861,
-2294, 826,1361,2927,3142,3503,1738, 463,2462,2723, 582,1916,1595,2808, 400,3845,
-3891,2868,3621,2254,  58,2492,1123, 910,2160,2614,1372,1603,1196,1072,3385,1700,
-3267,1980, 696, 480,2430, 920, 799,1570,2920,1951,2041,4047,2540,1321,4223,2469,
-3562,2228,1271,2602, 401,2833,3351,2575,5157, 907,2312,1256, 410, 263,3507,1582,
- 996, 678,1849,2316,1480, 908,3545,2237, 703,2322, 667,1826,2849,1531,2604,2999,
-2407,3146,2151,2630,1786,3711, 469,3542, 497,3899,2409, 858, 837,4446,3393,1274,
- 786, 620,1845,2001,3311, 484, 308,3367,1204,1815,3691,2332,1532,2557,1842,2020,
-2724,1927,2333,4440, 567,  22,1673,2728,4475,1987,1858,1144,1597, 101,1832,3601,
-  12, 974,3783,4391, 951,1412,   1,3720, 453,4608,4041, 528,1041,1027,3230,2628,
-1129, 875,1051,3291,1203,2262,1069,2860,2799,2149,2615,3278, 144,1758,3040,  31,
- 475,1680, 366,2685,3184, 311,1642,4008,2466,5036,1593,1493,2809, 216,1420,1668,
- 233, 304,2128,3284, 232,1429,1768,1040,2008,3407,2740,2967,2543, 242,2133, 778,
-1565,2022,2620, 505,2189,2756,1098,2273, 372,1614, 708, 553,2846,2094,2278, 169,
-3626,2835,4161, 228,2674,3165, 809,1454,1309, 466,1705,1095, 900,3423, 880,2667,
-3751,5258,2317,3109,2571,4317,2766,1503,1342, 866,4447,1118,  63,2076, 314,1881,
-1348,1061, 172, 978,3515,1747, 532, 511,3970,   6, 601, 905,2699,3300,1751, 276,
-1467,3725,2668,  65,4239,2544,2779,2556,1604, 578,2451,1802, 992,2331,2624,1320,
-3446, 713,1513,1013, 103,2786,2447,1661, 886,1702, 916, 654,3574,2031,1556, 751,
-2178,2821,2179,1498,1538,2176, 271, 914,2251,2080,1325, 638,1953,2937,3877,2432,
-2754,  95,3265,1716, 260,1227,4083, 775, 106,1357,3254, 426,1607, 555,2480, 772,
-1985, 244,2546, 474, 495,1046,2611,1851,2061,  71,2089,1675,2590, 742,3758,2843,
-3222,1433, 267,2180,2576,2826,2233,2092,3913,2435, 956,1745,3075, 856,2113,1116,
- 451,   3,1988,2896,1398, 993,2463,1878,2049,1341,2718,2721,2870,2108, 712,2904,
-4363,2753,2324, 277,2872,2349,2649, 384, 987, 435, 691,3000, 922, 164,3939, 652,
-1500,1184,4153,2482,3373,2165,4848,2335,3775,3508,3154,2806,2830,1554,2102,1664,
-2530,1434,2408, 893,1547,2623,3447,2832,2242,2532,3169,2856,3223,2078,  49,3770,
-3469, 462, 318, 656,2259,3250,3069, 679,1629,2758, 344,1138,1104,3120,1836,1283,
-3115,2154,1437,4448, 934, 759,1999, 794,2862,1038, 533,2560,1722,2342, 855,2626,
-1197,1663,4476,3127,  85,4240,2528,  25,1111,1181,3673, 407,3470,4561,2679,2713,
- 768,1925,2841,3986,1544,1165, 932, 373,1240,2146,1930,2673, 721,4766, 354,4333,
- 391,2963, 187,  61,3364,1442,1102, 330,1940,1767, 341,3809,4118, 393,2496,2062,
-2211, 105, 331, 300, 439, 913,1332, 626, 379,3304,1557, 328, 689,3952, 309,1555,
- 931, 317,2517,3027, 325, 569, 686,2107,3084,  60,1042,1333,2794, 264,3177,4014,
-1628, 258,3712,   7,4464,1176,1043,1778, 683, 114,1975,  78,1492, 383,1886, 510,
- 386, 645,5291,2891,2069,3305,4138,3867,2939,2603,2493,1935,1066,1848,3588,1015,
-1282,1289,4609, 697,1453,3044,2666,3611,1856,2412,  54, 719,1330, 568,3778,2459,
-1748, 788, 492, 551,1191,1000, 488,3394,3763, 282,1799, 348,2016,1523,3155,2390,
-1049, 382,2019,1788,1170, 729,2968,3523, 897,3926,2785,2938,3292, 350,2319,3238,
-1718,1717,2655,3453,3143,4465, 161,2889,2980,2009,1421,  56,1908,1640,2387,2232,
-1917,1874,2477,4921, 148,  83,3438, 592,4245,2882,1822,1055, 741, 115,1496,1624,
- 381,1638,4592,1020, 516,3214, 458, 947,4575,1432, 211,1514,2926,1865,2142, 189,
- 852,1221,1400,1486, 882,2299,4036, 351,  28,1122, 700,6479,6480,6481,6482,6483,  #last 512
-)
-
diff --git a/lib/sub_repos/chardet/chardet/gb2312prober.py b/lib/sub_repos/chardet/chardet/gb2312prober.py
deleted file mode 100644
index 8446d2dd9..000000000
--- a/lib/sub_repos/chardet/chardet/gb2312prober.py
+++ /dev/null
@@ -1,46 +0,0 @@
-######################## BEGIN LICENSE BLOCK ########################
-# The Original Code is mozilla.org code.
-#
-# The Initial Developer of the Original Code is
-# Netscape Communications Corporation.
-# Portions created by the Initial Developer are Copyright (C) 1998
-# the Initial Developer. All Rights Reserved.
-#
-# Contributor(s):
-#   Mark Pilgrim - port to Python
-#
-# This library is free software; you can redistribute it and/or
-# modify it under the terms of the GNU Lesser General Public
-# License as published by the Free Software Foundation; either
-# version 2.1 of the License, or (at your option) any later version.
-#
-# This library is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-# Lesser General Public License for more details.
-#
-# You should have received a copy of the GNU Lesser General Public
-# License along with this library; if not, write to the Free Software
-# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
-# 02110-1301  USA
-######################### END LICENSE BLOCK #########################
-
-from .mbcharsetprober import MultiByteCharSetProber
-from .codingstatemachine import CodingStateMachine
-from .chardistribution import GB2312DistributionAnalysis
-from .mbcssm import GB2312_SM_MODEL
-
-class GB2312Prober(MultiByteCharSetProber):
-    def __init__(self):
-        super(GB2312Prober, self).__init__()
-        self.coding_sm = CodingStateMachine(GB2312_SM_MODEL)
-        self.distribution_analyzer = GB2312DistributionAnalysis()
-        self.reset()
-
-    @property
-    def charset_name(self):
-        return "GB2312"
-
-    @property
-    def language(self):
-        return "Chinese"
diff --git a/lib/sub_repos/chardet/chardet/hebrewprober.py b/lib/sub_repos/chardet/chardet/hebrewprober.py
deleted file mode 100644
index b0e1bf492..000000000
--- a/lib/sub_repos/chardet/chardet/hebrewprober.py
+++ /dev/null
@@ -1,292 +0,0 @@
-######################## BEGIN LICENSE BLOCK ########################
-# The Original Code is Mozilla Universal charset detector code.
-#
-# The Initial Developer of the Original Code is
-#          Shy Shalom
-# Portions created by the Initial Developer are Copyright (C) 2005
-# the Initial Developer. All Rights Reserved.
-#
-# Contributor(s):
-#   Mark Pilgrim - port to Python
-#
-# This library is free software; you can redistribute it and/or
-# modify it under the terms of the GNU Lesser General Public
-# License as published by the Free Software Foundation; either
-# version 2.1 of the License, or (at your option) any later version.
-#
-# This library is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-# Lesser General Public License for more details.
-#
-# You should have received a copy of the GNU Lesser General Public
-# License along with this library; if not, write to the Free Software
-# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
-# 02110-1301  USA
-######################### END LICENSE BLOCK #########################
-
-from .charsetprober import CharSetProber
-from .enums import ProbingState
-
-# This prober doesn't actually recognize a language or a charset.
-# It is a helper prober for the use of the Hebrew model probers
-
-### General ideas of the Hebrew charset recognition ###
-#
-# Four main charsets exist in Hebrew:
-# "ISO-8859-8" - Visual Hebrew
-# "windows-1255" - Logical Hebrew
-# "ISO-8859-8-I" - Logical Hebrew
-# "x-mac-hebrew" - ?? Logical Hebrew ??
-#
-# Both "ISO" charsets use a completely identical set of code points, whereas
-# "windows-1255" and "x-mac-hebrew" are two different proper supersets of
-# these code points. windows-1255 defines additional characters in the range
-# 0x80-0x9F as some misc punctuation marks as well as some Hebrew-specific
-# diacritics and additional 'Yiddish' ligature letters in the range 0xc0-0xd6.
-# x-mac-hebrew defines similar additional code points but with a different
-# mapping.
-#
-# As far as an average Hebrew text with no diacritics is concerned, all four
-# charsets are identical with respect to code points. Meaning that for the
-# main Hebrew alphabet, all four map the same values to all 27 Hebrew letters
-# (including final letters).
-#
-# The dominant difference between these charsets is their directionality.
-# "Visual" directionality means that the text is ordered as if the renderer is
-# not aware of a BIDI rendering algorithm. The renderer sees the text and
-# draws it from left to right. The text itself when ordered naturally is read
-# backwards. A buffer of Visual Hebrew generally looks like so:
-# "[last word of first line spelled backwards] [whole line ordered backwards
-# and spelled backwards] [first word of first line spelled backwards]
-# [end of line] [last word of second line] ... etc' "
-# adding punctuation marks, numbers and English text to visual text is
-# naturally also "visual" and from left to right.
-#
-# "Logical" directionality means the text is ordered "naturally" according to
-# the order it is read. It is the responsibility of the renderer to display
-# the text from right to left. A BIDI algorithm is used to place general
-# punctuation marks, numbers and English text in the text.
-#
-# Texts in x-mac-hebrew are almost impossible to find on the Internet. From
-# what little evidence I could find, it seems that its general directionality
-# is Logical.
-#
-# To sum up all of the above, the Hebrew probing mechanism knows about two
-# charsets:
-# Visual Hebrew - "ISO-8859-8" - backwards text - Words and sentences are
-#    backwards while line order is natural. For charset recognition purposes
-#    the line order is unimportant (In fact, for this implementation, even
-#    word order is unimportant).
-# Logical Hebrew - "windows-1255" - normal, naturally ordered text.
-#
-# "ISO-8859-8-I" is a subset of windows-1255 and doesn't need to be
-#    specifically identified.
-# "x-mac-hebrew" is also identified as windows-1255. A text in x-mac-hebrew
-#    that contain special punctuation marks or diacritics is displayed with
-#    some unconverted characters showing as question marks. This problem might
-#    be corrected using another model prober for x-mac-hebrew. Due to the fact
-#    that x-mac-hebrew texts are so rare, writing another model prober isn't
-#    worth the effort and performance hit.
-#
-#### The Prober ####
-#
-# The prober is divided between two SBCharSetProbers and a HebrewProber,
-# all of which are managed, created, fed data, inquired and deleted by the
-# SBCSGroupProber. The two SBCharSetProbers identify that the text is in
-# fact some kind of Hebrew, Logical or Visual. The final decision about which
-# one is it is made by the HebrewProber by combining final-letter scores
-# with the scores of the two SBCharSetProbers to produce a final answer.
-#
-# The SBCSGroupProber is responsible for stripping the original text of HTML
-# tags, English characters, numbers, low-ASCII punctuation characters, spaces
-# and new lines. It reduces any sequence of such characters to a single space.
-# The buffer fed to each prober in the SBCS group prober is pure text in
-# high-ASCII.
-# The two SBCharSetProbers (model probers) share the same language model:
-# Win1255Model.
-# The first SBCharSetProber uses the model normally as any other
-# SBCharSetProber does, to recognize windows-1255, upon which this model was
-# built. The second SBCharSetProber is told to make the pair-of-letter
-# lookup in the language model backwards. This in practice exactly simulates
-# a visual Hebrew model using the windows-1255 logical Hebrew model.
-#
-# The HebrewProber is not using any language model. All it does is look for
-# final-letter evidence suggesting the text is either logical Hebrew or visual
-# Hebrew. Disjointed from the model probers, the results of the HebrewProber
-# alone are meaningless. HebrewProber always returns 0.00 as confidence
-# since it never identifies a charset by itself. Instead, the pointer to the
-# HebrewProber is passed to the model probers as a helper "Name Prober".
-# When the Group prober receives a positive identification from any prober,
-# it asks for the name of the charset identified. If the prober queried is a
-# Hebrew model prober, the model prober forwards the call to the
-# HebrewProber to make the final decision. In the HebrewProber, the
-# decision is made according to the final-letters scores maintained and Both
-# model probers scores. The answer is returned in the form of the name of the
-# charset identified, either "windows-1255" or "ISO-8859-8".
-
-class HebrewProber(CharSetProber):
-    # windows-1255 / ISO-8859-8 code points of interest
-    FINAL_KAF = 0xea
-    NORMAL_KAF = 0xeb
-    FINAL_MEM = 0xed
-    NORMAL_MEM = 0xee
-    FINAL_NUN = 0xef
-    NORMAL_NUN = 0xf0
-    FINAL_PE = 0xf3
-    NORMAL_PE = 0xf4
-    FINAL_TSADI = 0xf5
-    NORMAL_TSADI = 0xf6
-
-    # Minimum Visual vs Logical final letter score difference.
-    # If the difference is below this, don't rely solely on the final letter score
-    # distance.
-    MIN_FINAL_CHAR_DISTANCE = 5
-
-    # Minimum Visual vs Logical model score difference.
-    # If the difference is below this, don't rely at all on the model score
-    # distance.
-    MIN_MODEL_DISTANCE = 0.01
-
-    VISUAL_HEBREW_NAME = "ISO-8859-8"
-    LOGICAL_HEBREW_NAME = "windows-1255"
-
-    def __init__(self):
-        super(HebrewProber, self).__init__()
-        self._final_char_logical_score = None
-        self._final_char_visual_score = None
-        self._prev = None
-        self._before_prev = None
-        self._logical_prober = None
-        self._visual_prober = None
-        self.reset()
-
-    def reset(self):
-        self._final_char_logical_score = 0
-        self._final_char_visual_score = 0
-        # The two last characters seen in the previous buffer,
-        # mPrev and mBeforePrev are initialized to space in order to simulate
-        # a word delimiter at the beginning of the data
-        self._prev = ' '
-        self._before_prev = ' '
-        # These probers are owned by the group prober.
-
-    def set_model_probers(self, logicalProber, visualProber):
-        self._logical_prober = logicalProber
-        self._visual_prober = visualProber
-
-    def is_final(self, c):
-        return c in [self.FINAL_KAF, self.FINAL_MEM, self.FINAL_NUN,
-                     self.FINAL_PE, self.FINAL_TSADI]
-
-    def is_non_final(self, c):
-        # The normal Tsadi is not a good Non-Final letter due to words like
-        # 'lechotet' (to chat) containing an apostrophe after the tsadi. This
-        # apostrophe is converted to a space in FilterWithoutEnglishLetters
-        # causing the Non-Final tsadi to appear at an end of a word even
-        # though this is not the case in the original text.
-        # The letters Pe and Kaf rarely display a related behavior of not being
-        # a good Non-Final letter. Words like 'Pop', 'Winamp' and 'Mubarak'
-        # for example legally end with a Non-Final Pe or Kaf. However, the
-        # benefit of these letters as Non-Final letters outweighs the damage
-        # since these words are quite rare.
-        return c in [self.NORMAL_KAF, self.NORMAL_MEM,
-                     self.NORMAL_NUN, self.NORMAL_PE]
-
-    def feed(self, byte_str):
-        # Final letter analysis for logical-visual decision.
-        # Look for evidence that the received buffer is either logical Hebrew
-        # or visual Hebrew.
-        # The following cases are checked:
-        # 1) A word longer than 1 letter, ending with a final letter. This is
-        #    an indication that the text is laid out "naturally" since the
-        #    final letter really appears at the end. +1 for logical score.
-        # 2) A word longer than 1 letter, ending with a Non-Final letter. In
-        #    normal Hebrew, words ending with Kaf, Mem, Nun, Pe or Tsadi,
-        #    should not end with the Non-Final form of that letter. Exceptions
-        #    to this rule are mentioned above in isNonFinal(). This is an
-        #    indication that the text is laid out backwards. +1 for visual
-        #    score
-        # 3) A word longer than 1 letter, starting with a final letter. Final
-        #    letters should not appear at the beginning of a word. This is an
-        #    indication that the text is laid out backwards. +1 for visual
-        #    score.
-        #
-        # The visual score and logical score are accumulated throughout the
-        # text and are finally checked against each other in GetCharSetName().
-        # No checking for final letters in the middle of words is done since
-        # that case is not an indication for either Logical or Visual text.
-        #
-        # We automatically filter out all 7-bit characters (replace them with
-        # spaces) so the word boundary detection works properly. [MAP]
-
-        if self.state == ProbingState.NOT_ME:
-            # Both model probers say it's not them. No reason to continue.
-            return ProbingState.NOT_ME
-
-        byte_str = self.filter_high_byte_only(byte_str)
-
-        for cur in byte_str:
-            if cur == ' ':
-                # We stand on a space - a word just ended
-                if self._before_prev != ' ':
-                    # next-to-last char was not a space so self._prev is not a
-                    # 1 letter word
-                    if self.is_final(self._prev):
-                        # case (1) [-2:not space][-1:final letter][cur:space]
-                        self._final_char_logical_score += 1
-                    elif self.is_non_final(self._prev):
-                        # case (2) [-2:not space][-1:Non-Final letter][
-                        #  cur:space]
-                        self._final_char_visual_score += 1
-            else:
-                # Not standing on a space
-                if ((self._before_prev == ' ') and
-                        (self.is_final(self._prev)) and (cur != ' ')):
-                    # case (3) [-2:space][-1:final letter][cur:not space]
-                    self._final_char_visual_score += 1
-            self._before_prev = self._prev
-            self._prev = cur
-
-        # Forever detecting, till the end or until both model probers return
-        # ProbingState.NOT_ME (handled above)
-        return ProbingState.DETECTING
-
-    @property
-    def charset_name(self):
-        # Make the decision: is it Logical or Visual?
-        # If the final letter score distance is dominant enough, rely on it.
-        finalsub = self._final_char_logical_score - self._final_char_visual_score
-        if finalsub >= self.MIN_FINAL_CHAR_DISTANCE:
-            return self.LOGICAL_HEBREW_NAME
-        if finalsub <= -self.MIN_FINAL_CHAR_DISTANCE:
-            return self.VISUAL_HEBREW_NAME
-
-        # It's not dominant enough, try to rely on the model scores instead.
-        modelsub = (self._logical_prober.get_confidence()
-                    - self._visual_prober.get_confidence())
-        if modelsub > self.MIN_MODEL_DISTANCE:
-            return self.LOGICAL_HEBREW_NAME
-        if modelsub < -self.MIN_MODEL_DISTANCE:
-            return self.VISUAL_HEBREW_NAME
-
-        # Still no good, back to final letter distance, maybe it'll save the
-        # day.
-        if finalsub < 0.0:
-            return self.VISUAL_HEBREW_NAME
-
-        # (finalsub > 0 - Logical) or (don't know what to do) default to
-        # Logical.
-        return self.LOGICAL_HEBREW_NAME
-
-    @property
-    def language(self):
-        return 'Hebrew'
-
-    @property
-    def state(self):
-        # Remain active as long as any of the model probers are active.
-        if (self._logical_prober.state == ProbingState.NOT_ME) and \
-           (self._visual_prober.state == ProbingState.NOT_ME):
-            return ProbingState.NOT_ME
-        return ProbingState.DETECTING
diff --git a/lib/sub_repos/chardet/chardet/jisfreq.py b/lib/sub_repos/chardet/chardet/jisfreq.py
deleted file mode 100644
index 83fc082b5..000000000
--- a/lib/sub_repos/chardet/chardet/jisfreq.py
+++ /dev/null
@@ -1,325 +0,0 @@
-######################## BEGIN LICENSE BLOCK ########################
-# The Original Code is Mozilla Communicator client code.
-#
-# The Initial Developer of the Original Code is
-# Netscape Communications Corporation.
-# Portions created by the Initial Developer are Copyright (C) 1998
-# the Initial Developer. All Rights Reserved.
-#
-# Contributor(s):
-#   Mark Pilgrim - port to Python
-#
-# This library is free software; you can redistribute it and/or
-# modify it under the terms of the GNU Lesser General Public
-# License as published by the Free Software Foundation; either
-# version 2.1 of the License, or (at your option) any later version.
-#
-# This library is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-# Lesser General Public License for more details.
-#
-# You should have received a copy of the GNU Lesser General Public
-# License along with this library; if not, write to the Free Software
-# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
-# 02110-1301  USA
-######################### END LICENSE BLOCK #########################
-
-# Sampling from about 20M text materials include literature and computer technology
-#
-# Japanese frequency table, applied to both S-JIS and EUC-JP
-# They are sorted in order.
-
-# 128  --> 0.77094
-# 256  --> 0.85710
-# 512  --> 0.92635
-# 1024 --> 0.97130
-# 2048 --> 0.99431
-#
-# Ideal Distribution Ratio = 0.92635 / (1-0.92635) = 12.58
-# Random Distribution Ration = 512 / (2965+62+83+86-512) = 0.191
-#
-# Typical Distribution Ratio, 25% of IDR
-
-JIS_TYPICAL_DISTRIBUTION_RATIO = 3.0
-
-# Char to FreqOrder table ,
-JIS_TABLE_SIZE = 4368
-
-JIS_CHAR_TO_FREQ_ORDER = (
-  40,   1,   6, 182, 152, 180, 295,2127, 285, 381,3295,4304,3068,4606,3165,3510, #   16
-3511,1822,2785,4607,1193,2226,5070,4608, 171,2996,1247,  18, 179,5071, 856,1661, #   32
-1262,5072, 619, 127,3431,3512,3230,1899,1700, 232, 228,1294,1298, 284, 283,2041, #   48
-2042,1061,1062,  48,  49,  44,  45, 433, 434,1040,1041, 996, 787,2997,1255,4305, #   64
-2108,4609,1684,1648,5073,5074,5075,5076,5077,5078,3687,5079,4610,5080,3927,3928, #   80
-5081,3296,3432, 290,2285,1471,2187,5082,2580,2825,1303,2140,1739,1445,2691,3375, #   96
-1691,3297,4306,4307,4611, 452,3376,1182,2713,3688,3069,4308,5083,5084,5085,5086, #  112
-5087,5088,5089,5090,5091,5092,5093,5094,5095,5096,5097,5098,5099,5100,5101,5102, #  128
-5103,5104,5105,5106,5107,5108,5109,5110,5111,5112,4097,5113,5114,5115,5116,5117, #  144
-5118,5119,5120,5121,5122,5123,5124,5125,5126,5127,5128,5129,5130,5131,5132,5133, #  160
-5134,5135,5136,5137,5138,5139,5140,5141,5142,5143,5144,5145,5146,5147,5148,5149, #  176
-5150,5151,5152,4612,5153,5154,5155,5156,5157,5158,5159,5160,5161,5162,5163,5164, #  192
-5165,5166,5167,5168,5169,5170,5171,5172,5173,5174,5175,1472, 598, 618, 820,1205, #  208
-1309,1412,1858,1307,1692,5176,5177,5178,5179,5180,5181,5182,1142,1452,1234,1172, #  224
-1875,2043,2149,1793,1382,2973, 925,2404,1067,1241, 960,1377,2935,1491, 919,1217, #  240
-1865,2030,1406,1499,2749,4098,5183,5184,5185,5186,5187,5188,2561,4099,3117,1804, #  256
-2049,3689,4309,3513,1663,5189,3166,3118,3298,1587,1561,3433,5190,3119,1625,2998, #  272
-3299,4613,1766,3690,2786,4614,5191,5192,5193,5194,2161,  26,3377,   2,3929,  20, #  288
-3691,  47,4100,  50,  17,  16,  35, 268,  27, 243,  42, 155,  24, 154,  29, 184, #  304
-   4,  91,  14,  92,  53, 396,  33, 289,   9,  37,  64, 620,  21,  39, 321,   5, #  320
-  12,  11,  52,  13,   3, 208, 138,   0,   7,  60, 526, 141, 151,1069, 181, 275, #  336
-1591,  83, 132,1475, 126, 331, 829,  15,  69, 160,  59,  22, 157,  55,1079, 312, #  352
- 109,  38,  23,  25,  10,  19,  79,5195,  61, 382,1124,   8,  30,5196,5197,5198, #  368
-5199,5200,5201,5202,5203,5204,5205,5206,  89,  62,  74,  34,2416, 112, 139, 196, #  384
- 271, 149,  84, 607, 131, 765,  46,  88, 153, 683,  76, 874, 101, 258,  57,  80, #  400
-  32, 364, 121,1508, 169,1547,  68, 235, 145,2999,  41, 360,3027,  70,  63,  31, #  416
-  43, 259, 262,1383,  99, 533, 194,  66,  93, 846, 217, 192,  56, 106,  58, 565, #  432
- 280, 272, 311, 256, 146,  82, 308,  71, 100, 128, 214, 655, 110, 261, 104,1140, #  448
-  54,  51,  36,  87,  67,3070, 185,2618,2936,2020,  28,1066,2390,2059,5207,5208, #  464
-5209,5210,5211,5212,5213,5214,5215,5216,4615,5217,5218,5219,5220,5221,5222,5223, #  480
-5224,5225,5226,5227,5228,5229,5230,5231,5232,5233,5234,5235,5236,3514,5237,5238, #  496
-5239,5240,5241,5242,5243,5244,2297,2031,4616,4310,3692,5245,3071,5246,3598,5247, #  512
-4617,3231,3515,5248,4101,4311,4618,3808,4312,4102,5249,4103,4104,3599,5250,5251, #  528
-5252,5253,5254,5255,5256,5257,5258,5259,5260,5261,5262,5263,5264,5265,5266,5267, #  544
-5268,5269,5270,5271,5272,5273,5274,5275,5276,5277,5278,5279,5280,5281,5282,5283, #  560
-5284,5285,5286,5287,5288,5289,5290,5291,5292,5293,5294,5295,5296,5297,5298,5299, #  576
-5300,5301,5302,5303,5304,5305,5306,5307,5308,5309,5310,5311,5312,5313,5314,5315, #  592
-5316,5317,5318,5319,5320,5321,5322,5323,5324,5325,5326,5327,5328,5329,5330,5331, #  608
-5332,5333,5334,5335,5336,5337,5338,5339,5340,5341,5342,5343,5344,5345,5346,5347, #  624
-5348,5349,5350,5351,5352,5353,5354,5355,5356,5357,5358,5359,5360,5361,5362,5363, #  640
-5364,5365,5366,5367,5368,5369,5370,5371,5372,5373,5374,5375,5376,5377,5378,5379, #  656
-5380,5381, 363, 642,2787,2878,2788,2789,2316,3232,2317,3434,2011, 165,1942,3930, #  672
-3931,3932,3933,5382,4619,5383,4620,5384,5385,5386,5387,5388,5389,5390,5391,5392, #  688
-5393,5394,5395,5396,5397,5398,5399,5400,5401,5402,5403,5404,5405,5406,5407,5408, #  704
-5409,5410,5411,5412,5413,5414,5415,5416,5417,5418,5419,5420,5421,5422,5423,5424, #  720
-5425,5426,5427,5428,5429,5430,5431,5432,5433,5434,5435,5436,5437,5438,5439,5440, #  736
-5441,5442,5443,5444,5445,5446,5447,5448,5449,5450,5451,5452,5453,5454,5455,5456, #  752
-5457,5458,5459,5460,5461,5462,5463,5464,5465,5466,5467,5468,5469,5470,5471,5472, #  768
-5473,5474,5475,5476,5477,5478,5479,5480,5481,5482,5483,5484,5485,5486,5487,5488, #  784
-5489,5490,5491,5492,5493,5494,5495,5496,5497,5498,5499,5500,5501,5502,5503,5504, #  800
-5505,5506,5507,5508,5509,5510,5511,5512,5513,5514,5515,5516,5517,5518,5519,5520, #  816
-5521,5522,5523,5524,5525,5526,5527,5528,5529,5530,5531,5532,5533,5534,5535,5536, #  832
-5537,5538,5539,5540,5541,5542,5543,5544,5545,5546,5547,5548,5549,5550,5551,5552, #  848
-5553,5554,5555,5556,5557,5558,5559,5560,5561,5562,5563,5564,5565,5566,5567,5568, #  864
-5569,5570,5571,5572,5573,5574,5575,5576,5577,5578,5579,5580,5581,5582,5583,5584, #  880
-5585,5586,5587,5588,5589,5590,5591,5592,5593,5594,5595,5596,5597,5598,5599,5600, #  896
-5601,5602,5603,5604,5605,5606,5607,5608,5609,5610,5611,5612,5613,5614,5615,5616, #  912
-5617,5618,5619,5620,5621,5622,5623,5624,5625,5626,5627,5628,5629,5630,5631,5632, #  928
-5633,5634,5635,5636,5637,5638,5639,5640,5641,5642,5643,5644,5645,5646,5647,5648, #  944
-5649,5650,5651,5652,5653,5654,5655,5656,5657,5658,5659,5660,5661,5662,5663,5664, #  960
-5665,5666,5667,5668,5669,5670,5671,5672,5673,5674,5675,5676,5677,5678,5679,5680, #  976
-5681,5682,5683,5684,5685,5686,5687,5688,5689,5690,5691,5692,5693,5694,5695,5696, #  992
-5697,5698,5699,5700,5701,5702,5703,5704,5705,5706,5707,5708,5709,5710,5711,5712, # 1008
-5713,5714,5715,5716,5717,5718,5719,5720,5721,5722,5723,5724,5725,5726,5727,5728, # 1024
-5729,5730,5731,5732,5733,5734,5735,5736,5737,5738,5739,5740,5741,5742,5743,5744, # 1040
-5745,5746,5747,5748,5749,5750,5751,5752,5753,5754,5755,5756,5757,5758,5759,5760, # 1056
-5761,5762,5763,5764,5765,5766,5767,5768,5769,5770,5771,5772,5773,5774,5775,5776, # 1072
-5777,5778,5779,5780,5781,5782,5783,5784,5785,5786,5787,5788,5789,5790,5791,5792, # 1088
-5793,5794,5795,5796,5797,5798,5799,5800,5801,5802,5803,5804,5805,5806,5807,5808, # 1104
-5809,5810,5811,5812,5813,5814,5815,5816,5817,5818,5819,5820,5821,5822,5823,5824, # 1120
-5825,5826,5827,5828,5829,5830,5831,5832,5833,5834,5835,5836,5837,5838,5839,5840, # 1136
-5841,5842,5843,5844,5845,5846,5847,5848,5849,5850,5851,5852,5853,5854,5855,5856, # 1152
-5857,5858,5859,5860,5861,5862,5863,5864,5865,5866,5867,5868,5869,5870,5871,5872, # 1168
-5873,5874,5875,5876,5877,5878,5879,5880,5881,5882,5883,5884,5885,5886,5887,5888, # 1184
-5889,5890,5891,5892,5893,5894,5895,5896,5897,5898,5899,5900,5901,5902,5903,5904, # 1200
-5905,5906,5907,5908,5909,5910,5911,5912,5913,5914,5915,5916,5917,5918,5919,5920, # 1216
-5921,5922,5923,5924,5925,5926,5927,5928,5929,5930,5931,5932,5933,5934,5935,5936, # 1232
-5937,5938,5939,5940,5941,5942,5943,5944,5945,5946,5947,5948,5949,5950,5951,5952, # 1248
-5953,5954,5955,5956,5957,5958,5959,5960,5961,5962,5963,5964,5965,5966,5967,5968, # 1264
-5969,5970,5971,5972,5973,5974,5975,5976,5977,5978,5979,5980,5981,5982,5983,5984, # 1280
-5985,5986,5987,5988,5989,5990,5991,5992,5993,5994,5995,5996,5997,5998,5999,6000, # 1296
-6001,6002,6003,6004,6005,6006,6007,6008,6009,6010,6011,6012,6013,6014,6015,6016, # 1312
-6017,6018,6019,6020,6021,6022,6023,6024,6025,6026,6027,6028,6029,6030,6031,6032, # 1328
-6033,6034,6035,6036,6037,6038,6039,6040,6041,6042,6043,6044,6045,6046,6047,6048, # 1344
-6049,6050,6051,6052,6053,6054,6055,6056,6057,6058,6059,6060,6061,6062,6063,6064, # 1360
-6065,6066,6067,6068,6069,6070,6071,6072,6073,6074,6075,6076,6077,6078,6079,6080, # 1376
-6081,6082,6083,6084,6085,6086,6087,6088,6089,6090,6091,6092,6093,6094,6095,6096, # 1392
-6097,6098,6099,6100,6101,6102,6103,6104,6105,6106,6107,6108,6109,6110,6111,6112, # 1408
-6113,6114,2044,2060,4621, 997,1235, 473,1186,4622, 920,3378,6115,6116, 379,1108, # 1424
-4313,2657,2735,3934,6117,3809, 636,3233, 573,1026,3693,3435,2974,3300,2298,4105, # 1440
- 854,2937,2463, 393,2581,2417, 539, 752,1280,2750,2480, 140,1161, 440, 708,1569, # 1456
- 665,2497,1746,1291,1523,3000, 164,1603, 847,1331, 537,1997, 486, 508,1693,2418, # 1472
-1970,2227, 878,1220, 299,1030, 969, 652,2751, 624,1137,3301,2619,  65,3302,2045, # 1488
-1761,1859,3120,1930,3694,3516, 663,1767, 852, 835,3695, 269, 767,2826,2339,1305, # 1504
- 896,1150, 770,1616,6118, 506,1502,2075,1012,2519, 775,2520,2975,2340,2938,4314, # 1520
-3028,2086,1224,1943,2286,6119,3072,4315,2240,1273,1987,3935,1557, 175, 597, 985, # 1536
-3517,2419,2521,1416,3029, 585, 938,1931,1007,1052,1932,1685,6120,3379,4316,4623, # 1552
- 804, 599,3121,1333,2128,2539,1159,1554,2032,3810, 687,2033,2904, 952, 675,1467, # 1568
-3436,6121,2241,1096,1786,2440,1543,1924, 980,1813,2228, 781,2692,1879, 728,1918, # 1584
-3696,4624, 548,1950,4625,1809,1088,1356,3303,2522,1944, 502, 972, 373, 513,2827, # 1600
- 586,2377,2391,1003,1976,1631,6122,2464,1084, 648,1776,4626,2141, 324, 962,2012, # 1616
-2177,2076,1384, 742,2178,1448,1173,1810, 222, 102, 301, 445, 125,2420, 662,2498, # 1632
- 277, 200,1476,1165,1068, 224,2562,1378,1446, 450,1880, 659, 791, 582,4627,2939, # 1648
-3936,1516,1274, 555,2099,3697,1020,1389,1526,3380,1762,1723,1787,2229, 412,2114, # 1664
-1900,2392,3518, 512,2597, 427,1925,2341,3122,1653,1686,2465,2499, 697, 330, 273, # 1680
- 380,2162, 951, 832, 780, 991,1301,3073, 965,2270,3519, 668,2523,2636,1286, 535, # 1696
-1407, 518, 671, 957,2658,2378, 267, 611,2197,3030,6123, 248,2299, 967,1799,2356, # 1712
- 850,1418,3437,1876,1256,1480,2828,1718,6124,6125,1755,1664,2405,6126,4628,2879, # 1728
-2829, 499,2179, 676,4629, 557,2329,2214,2090, 325,3234, 464, 811,3001, 992,2342, # 1744
-2481,1232,1469, 303,2242, 466,1070,2163, 603,1777,2091,4630,2752,4631,2714, 322, # 1760
-2659,1964,1768, 481,2188,1463,2330,2857,3600,2092,3031,2421,4632,2318,2070,1849, # 1776
-2598,4633,1302,2254,1668,1701,2422,3811,2905,3032,3123,2046,4106,1763,1694,4634, # 1792
-1604, 943,1724,1454, 917, 868,2215,1169,2940, 552,1145,1800,1228,1823,1955, 316, # 1808
-1080,2510, 361,1807,2830,4107,2660,3381,1346,1423,1134,4108,6127, 541,1263,1229, # 1824
-1148,2540, 545, 465,1833,2880,3438,1901,3074,2482, 816,3937, 713,1788,2500, 122, # 1840
-1575, 195,1451,2501,1111,6128, 859, 374,1225,2243,2483,4317, 390,1033,3439,3075, # 1856
-2524,1687, 266, 793,1440,2599, 946, 779, 802, 507, 897,1081, 528,2189,1292, 711, # 1872
-1866,1725,1167,1640, 753, 398,2661,1053, 246, 348,4318, 137,1024,3440,1600,2077, # 1888
-2129, 825,4319, 698, 238, 521, 187,2300,1157,2423,1641,1605,1464,1610,1097,2541, # 1904
-1260,1436, 759,2255,1814,2150, 705,3235, 409,2563,3304, 561,3033,2005,2564, 726, # 1920
-1956,2343,3698,4109, 949,3812,3813,3520,1669, 653,1379,2525, 881,2198, 632,2256, # 1936
-1027, 778,1074, 733,1957, 514,1481,2466, 554,2180, 702,3938,1606,1017,1398,6129, # 1952
-1380,3521, 921, 993,1313, 594, 449,1489,1617,1166, 768,1426,1360, 495,1794,3601, # 1968
-1177,3602,1170,4320,2344, 476, 425,3167,4635,3168,1424, 401,2662,1171,3382,1998, # 1984
-1089,4110, 477,3169, 474,6130,1909, 596,2831,1842, 494, 693,1051,1028,1207,3076, # 2000
- 606,2115, 727,2790,1473,1115, 743,3522, 630, 805,1532,4321,2021, 366,1057, 838, # 2016
- 684,1114,2142,4322,2050,1492,1892,1808,2271,3814,2424,1971,1447,1373,3305,1090, # 2032
-1536,3939,3523,3306,1455,2199, 336, 369,2331,1035, 584,2393, 902, 718,2600,6131, # 2048
-2753, 463,2151,1149,1611,2467, 715,1308,3124,1268, 343,1413,3236,1517,1347,2663, # 2064
-2093,3940,2022,1131,1553,2100,2941,1427,3441,2942,1323,2484,6132,1980, 872,2368, # 2080
-2441,2943, 320,2369,2116,1082, 679,1933,3941,2791,3815, 625,1143,2023, 422,2200, # 2096
-3816,6133, 730,1695, 356,2257,1626,2301,2858,2637,1627,1778, 937, 883,2906,2693, # 2112
-3002,1769,1086, 400,1063,1325,3307,2792,4111,3077, 456,2345,1046, 747,6134,1524, # 2128
- 884,1094,3383,1474,2164,1059, 974,1688,2181,2258,1047, 345,1665,1187, 358, 875, # 2144
-3170, 305, 660,3524,2190,1334,1135,3171,1540,1649,2542,1527, 927, 968,2793, 885, # 2160
-1972,1850, 482, 500,2638,1218,1109,1085,2543,1654,2034, 876,  78,2287,1482,1277, # 2176
- 861,1675,1083,1779, 724,2754, 454, 397,1132,1612,2332, 893, 672,1237, 257,2259, # 2192
-2370, 135,3384, 337,2244, 547, 352, 340, 709,2485,1400, 788,1138,2511, 540, 772, # 2208
-1682,2260,2272,2544,2013,1843,1902,4636,1999,1562,2288,4637,2201,1403,1533, 407, # 2224
- 576,3308,1254,2071, 978,3385, 170, 136,1201,3125,2664,3172,2394, 213, 912, 873, # 2240
-3603,1713,2202, 699,3604,3699, 813,3442, 493, 531,1054, 468,2907,1483, 304, 281, # 2256
-4112,1726,1252,2094, 339,2319,2130,2639, 756,1563,2944, 748, 571,2976,1588,2425, # 2272
-2715,1851,1460,2426,1528,1392,1973,3237, 288,3309, 685,3386, 296, 892,2716,2216, # 2288
-1570,2245, 722,1747,2217, 905,3238,1103,6135,1893,1441,1965, 251,1805,2371,3700, # 2304
-2601,1919,1078,  75,2182,1509,1592,1270,2640,4638,2152,6136,3310,3817, 524, 706, # 2320
-1075, 292,3818,1756,2602, 317,  98,3173,3605,3525,1844,2218,3819,2502, 814, 567, # 2336
- 385,2908,1534,6137, 534,1642,3239, 797,6138,1670,1529, 953,4323, 188,1071, 538, # 2352
- 178, 729,3240,2109,1226,1374,2000,2357,2977, 731,2468,1116,2014,2051,6139,1261, # 2368
-1593, 803,2859,2736,3443, 556, 682, 823,1541,6140,1369,2289,1706,2794, 845, 462, # 2384
-2603,2665,1361, 387, 162,2358,1740, 739,1770,1720,1304,1401,3241,1049, 627,1571, # 2400
-2427,3526,1877,3942,1852,1500, 431,1910,1503, 677, 297,2795, 286,1433,1038,1198, # 2416
-2290,1133,1596,4113,4639,2469,1510,1484,3943,6141,2442, 108, 712,4640,2372, 866, # 2432
-3701,2755,3242,1348, 834,1945,1408,3527,2395,3243,1811, 824, 994,1179,2110,1548, # 2448
-1453, 790,3003, 690,4324,4325,2832,2909,3820,1860,3821, 225,1748, 310, 346,1780, # 2464
-2470, 821,1993,2717,2796, 828, 877,3528,2860,2471,1702,2165,2910,2486,1789, 453, # 2480
- 359,2291,1676,  73,1164,1461,1127,3311, 421, 604, 314,1037, 589, 116,2487, 737, # 2496
- 837,1180, 111, 244, 735,6142,2261,1861,1362, 986, 523, 418, 581,2666,3822, 103, # 2512
- 855, 503,1414,1867,2488,1091, 657,1597, 979, 605,1316,4641,1021,2443,2078,2001, # 2528
-1209,  96, 587,2166,1032, 260,1072,2153, 173,  94, 226,3244, 819,2006,4642,4114, # 2544
-2203, 231,1744, 782,  97,2667, 786,3387, 887, 391, 442,2219,4326,1425,6143,2694, # 2560
- 633,1544,1202, 483,2015, 592,2052,1958,2472,1655, 419, 129,4327,3444,3312,1714, # 2576
-1257,3078,4328,1518,1098, 865,1310,1019,1885,1512,1734, 469,2444, 148, 773, 436, # 2592
-1815,1868,1128,1055,4329,1245,2756,3445,2154,1934,1039,4643, 579,1238, 932,2320, # 2608
- 353, 205, 801, 115,2428, 944,2321,1881, 399,2565,1211, 678, 766,3944, 335,2101, # 2624
-1459,1781,1402,3945,2737,2131,1010, 844, 981,1326,1013, 550,1816,1545,2620,1335, # 2640
-1008, 371,2881, 936,1419,1613,3529,1456,1395,2273,1834,2604,1317,2738,2503, 416, # 2656
-1643,4330, 806,1126, 229, 591,3946,1314,1981,1576,1837,1666, 347,1790, 977,3313, # 2672
- 764,2861,1853, 688,2429,1920,1462,  77, 595, 415,2002,3034, 798,1192,4115,6144, # 2688
-2978,4331,3035,2695,2582,2072,2566, 430,2430,1727, 842,1396,3947,3702, 613, 377, # 2704
- 278, 236,1417,3388,3314,3174, 757,1869, 107,3530,6145,1194, 623,2262, 207,1253, # 2720
-2167,3446,3948, 492,1117,1935, 536,1838,2757,1246,4332, 696,2095,2406,1393,1572, # 2736
-3175,1782, 583, 190, 253,1390,2230, 830,3126,3389, 934,3245,1703,1749,2979,1870, # 2752
-2545,1656,2204, 869,2346,4116,3176,1817, 496,1764,4644, 942,1504, 404,1903,1122, # 2768
-1580,3606,2945,1022, 515, 372,1735, 955,2431,3036,6146,2797,1110,2302,2798, 617, # 2784
-6147, 441, 762,1771,3447,3607,3608,1904, 840,3037,  86, 939,1385, 572,1370,2445, # 2800
-1336, 114,3703, 898, 294, 203,3315, 703,1583,2274, 429, 961,4333,1854,1951,3390, # 2816
-2373,3704,4334,1318,1381, 966,1911,2322,1006,1155, 309, 989, 458,2718,1795,1372, # 2832
-1203, 252,1689,1363,3177, 517,1936, 168,1490, 562, 193,3823,1042,4117,1835, 551, # 2848
- 470,4645, 395, 489,3448,1871,1465,2583,2641, 417,1493, 279,1295, 511,1236,1119, # 2864
-  72,1231,1982,1812,3004, 871,1564, 984,3449,1667,2696,2096,4646,2347,2833,1673, # 2880
-3609, 695,3246,2668, 807,1183,4647, 890, 388,2333,1801,1457,2911,1765,1477,1031, # 2896
-3316,3317,1278,3391,2799,2292,2526, 163,3450,4335,2669,1404,1802,6148,2323,2407, # 2912
-1584,1728,1494,1824,1269, 298, 909,3318,1034,1632, 375, 776,1683,2061, 291, 210, # 2928
-1123, 809,1249,1002,2642,3038, 206,1011,2132, 144, 975, 882,1565, 342, 667, 754, # 2944
-1442,2143,1299,2303,2062, 447, 626,2205,1221,2739,2912,1144,1214,2206,2584, 760, # 2960
-1715, 614, 950,1281,2670,2621, 810, 577,1287,2546,4648, 242,2168, 250,2643, 691, # 2976
- 123,2644, 647, 313,1029, 689,1357,2946,1650, 216, 771,1339,1306, 808,2063, 549, # 2992
- 913,1371,2913,2914,6149,1466,1092,1174,1196,1311,2605,2396,1783,1796,3079, 406, # 3008
-2671,2117,3949,4649, 487,1825,2220,6150,2915, 448,2348,1073,6151,2397,1707, 130, # 3024
- 900,1598, 329, 176,1959,2527,1620,6152,2275,4336,3319,1983,2191,3705,3610,2155, # 3040
-3706,1912,1513,1614,6153,1988, 646, 392,2304,1589,3320,3039,1826,1239,1352,1340, # 3056
-2916, 505,2567,1709,1437,2408,2547, 906,6154,2672, 384,1458,1594,1100,1329, 710, # 3072
- 423,3531,2064,2231,2622,1989,2673,1087,1882, 333, 841,3005,1296,2882,2379, 580, # 3088
-1937,1827,1293,2585, 601, 574, 249,1772,4118,2079,1120, 645, 901,1176,1690, 795, # 3104
-2207, 478,1434, 516,1190,1530, 761,2080, 930,1264, 355, 435,1552, 644,1791, 987, # 3120
- 220,1364,1163,1121,1538, 306,2169,1327,1222, 546,2645, 218, 241, 610,1704,3321, # 3136
-1984,1839,1966,2528, 451,6155,2586,3707,2568, 907,3178, 254,2947, 186,1845,4650, # 3152
- 745, 432,1757, 428,1633, 888,2246,2221,2489,3611,2118,1258,1265, 956,3127,1784, # 3168
-4337,2490, 319, 510, 119, 457,3612, 274,2035,2007,4651,1409,3128, 970,2758, 590, # 3184
-2800, 661,2247,4652,2008,3950,1420,1549,3080,3322,3951,1651,1375,2111, 485,2491, # 3200
-1429,1156,6156,2548,2183,1495, 831,1840,2529,2446, 501,1657, 307,1894,3247,1341, # 3216
- 666, 899,2156,1539,2549,1559, 886, 349,2208,3081,2305,1736,3824,2170,2759,1014, # 3232
-1913,1386, 542,1397,2948, 490, 368, 716, 362, 159, 282,2569,1129,1658,1288,1750, # 3248
-2674, 276, 649,2016, 751,1496, 658,1818,1284,1862,2209,2087,2512,3451, 622,2834, # 3264
- 376, 117,1060,2053,1208,1721,1101,1443, 247,1250,3179,1792,3952,2760,2398,3953, # 3280
-6157,2144,3708, 446,2432,1151,2570,3452,2447,2761,2835,1210,2448,3082, 424,2222, # 3296
-1251,2449,2119,2836, 504,1581,4338, 602, 817, 857,3825,2349,2306, 357,3826,1470, # 3312
-1883,2883, 255, 958, 929,2917,3248, 302,4653,1050,1271,1751,2307,1952,1430,2697, # 3328
-2719,2359, 354,3180, 777, 158,2036,4339,1659,4340,4654,2308,2949,2248,1146,2232, # 3344
-3532,2720,1696,2623,3827,6158,3129,1550,2698,1485,1297,1428, 637, 931,2721,2145, # 3360
- 914,2550,2587,  81,2450, 612, 827,2646,1242,4655,1118,2884, 472,1855,3181,3533, # 3376
-3534, 569,1353,2699,1244,1758,2588,4119,2009,2762,2171,3709,1312,1531,6159,1152, # 3392
-1938, 134,1830, 471,3710,2276,1112,1535,3323,3453,3535, 982,1337,2950, 488, 826, # 3408
- 674,1058,1628,4120,2017, 522,2399, 211, 568,1367,3454, 350, 293,1872,1139,3249, # 3424
-1399,1946,3006,1300,2360,3324, 588, 736,6160,2606, 744, 669,3536,3828,6161,1358, # 3440
- 199, 723, 848, 933, 851,1939,1505,1514,1338,1618,1831,4656,1634,3613, 443,2740, # 3456
-3829, 717,1947, 491,1914,6162,2551,1542,4121,1025,6163,1099,1223, 198,3040,2722, # 3472
- 370, 410,1905,2589, 998,1248,3182,2380, 519,1449,4122,1710, 947, 928,1153,4341, # 3488
-2277, 344,2624,1511, 615, 105, 161,1212,1076,1960,3130,2054,1926,1175,1906,2473, # 3504
- 414,1873,2801,6164,2309, 315,1319,3325, 318,2018,2146,2157, 963, 631, 223,4342, # 3520
-4343,2675, 479,3711,1197,2625,3712,2676,2361,6165,4344,4123,6166,2451,3183,1886, # 3536
-2184,1674,1330,1711,1635,1506, 799, 219,3250,3083,3954,1677,3713,3326,2081,3614, # 3552
-1652,2073,4657,1147,3041,1752, 643,1961, 147,1974,3955,6167,1716,2037, 918,3007, # 3568
-1994, 120,1537, 118, 609,3184,4345, 740,3455,1219, 332,1615,3830,6168,1621,2980, # 3584
-1582, 783, 212, 553,2350,3714,1349,2433,2082,4124, 889,6169,2310,1275,1410, 973, # 3600
- 166,1320,3456,1797,1215,3185,2885,1846,2590,2763,4658, 629, 822,3008, 763, 940, # 3616
-1990,2862, 439,2409,1566,1240,1622, 926,1282,1907,2764, 654,2210,1607, 327,1130, # 3632
-3956,1678,1623,6170,2434,2192, 686, 608,3831,3715, 903,3957,3042,6171,2741,1522, # 3648
-1915,1105,1555,2552,1359, 323,3251,4346,3457, 738,1354,2553,2311,2334,1828,2003, # 3664
-3832,1753,2351,1227,6172,1887,4125,1478,6173,2410,1874,1712,1847, 520,1204,2607, # 3680
- 264,4659, 836,2677,2102, 600,4660,3833,2278,3084,6174,4347,3615,1342, 640, 532, # 3696
- 543,2608,1888,2400,2591,1009,4348,1497, 341,1737,3616,2723,1394, 529,3252,1321, # 3712
- 983,4661,1515,2120, 971,2592, 924, 287,1662,3186,4349,2700,4350,1519, 908,1948, # 3728
-2452, 156, 796,1629,1486,2223,2055, 694,4126,1259,1036,3392,1213,2249,2742,1889, # 3744
-1230,3958,1015, 910, 408, 559,3617,4662, 746, 725, 935,4663,3959,3009,1289, 563, # 3760
- 867,4664,3960,1567,2981,2038,2626, 988,2263,2381,4351, 143,2374, 704,1895,6175, # 3776
-1188,3716,2088, 673,3085,2362,4352, 484,1608,1921,2765,2918, 215, 904,3618,3537, # 3792
- 894, 509, 976,3043,2701,3961,4353,2837,2982, 498,6176,6177,1102,3538,1332,3393, # 3808
-1487,1636,1637, 233, 245,3962, 383, 650, 995,3044, 460,1520,1206,2352, 749,3327, # 3824
- 530, 700, 389,1438,1560,1773,3963,2264, 719,2951,2724,3834, 870,1832,1644,1000, # 3840
- 839,2474,3717, 197,1630,3394, 365,2886,3964,1285,2133, 734, 922, 818,1106, 732, # 3856
- 480,2083,1774,3458, 923,2279,1350, 221,3086,  85,2233,2234,3835,1585,3010,2147, # 3872
-1387,1705,2382,1619,2475, 133, 239,2802,1991,1016,2084,2383, 411,2838,1113, 651, # 3888
-1985,1160,3328, 990,1863,3087,1048,1276,2647, 265,2627,1599,3253,2056, 150, 638, # 3904
-2019, 656, 853, 326,1479, 680,1439,4354,1001,1759, 413,3459,3395,2492,1431, 459, # 3920
-4355,1125,3329,2265,1953,1450,2065,2863, 849, 351,2678,3131,3254,3255,1104,1577, # 3936
- 227,1351,1645,2453,2193,1421,2887, 812,2121, 634,  95,2435, 201,2312,4665,1646, # 3952
-1671,2743,1601,2554,2702,2648,2280,1315,1366,2089,3132,1573,3718,3965,1729,1189, # 3968
- 328,2679,1077,1940,1136, 558,1283, 964,1195, 621,2074,1199,1743,3460,3619,1896, # 3984
-1916,1890,3836,2952,1154,2112,1064, 862, 378,3011,2066,2113,2803,1568,2839,6178, # 4000
-3088,2919,1941,1660,2004,1992,2194, 142, 707,1590,1708,1624,1922,1023,1836,1233, # 4016
-1004,2313, 789, 741,3620,6179,1609,2411,1200,4127,3719,3720,4666,2057,3721, 593, # 4032
-2840, 367,2920,1878,6180,3461,1521, 628,1168, 692,2211,2649, 300, 720,2067,2571, # 4048
-2953,3396, 959,2504,3966,3539,3462,1977, 701,6181, 954,1043, 800, 681, 183,3722, # 4064
-1803,1730,3540,4128,2103, 815,2314, 174, 467, 230,2454,1093,2134, 755,3541,3397, # 4080
-1141,1162,6182,1738,2039, 270,3256,2513,1005,1647,2185,3837, 858,1679,1897,1719, # 4096
-2954,2324,1806, 402, 670, 167,4129,1498,2158,2104, 750,6183, 915, 189,1680,1551, # 4112
- 455,4356,1501,2455, 405,1095,2955, 338,1586,1266,1819, 570, 641,1324, 237,1556, # 4128
-2650,1388,3723,6184,1368,2384,1343,1978,3089,2436, 879,3724, 792,1191, 758,3012, # 4144
-1411,2135,1322,4357, 240,4667,1848,3725,1574,6185, 420,3045,1546,1391, 714,4358, # 4160
-1967, 941,1864, 863, 664, 426, 560,1731,2680,1785,2864,1949,2363, 403,3330,1415, # 4176
-1279,2136,1697,2335, 204, 721,2097,3838,  90,6186,2085,2505, 191,3967, 124,2148, # 4192
-1376,1798,1178,1107,1898,1405, 860,4359,1243,1272,2375,2983,1558,2456,1638, 113, # 4208
-3621, 578,1923,2609, 880, 386,4130, 784,2186,2266,1422,2956,2172,1722, 497, 263, # 4224
-2514,1267,2412,2610, 177,2703,3542, 774,1927,1344, 616,1432,1595,1018, 172,4360, # 4240
-2325, 911,4361, 438,1468,3622, 794,3968,2024,2173,1681,1829,2957, 945, 895,3090, # 4256
- 575,2212,2476, 475,2401,2681, 785,2744,1745,2293,2555,1975,3133,2865, 394,4668, # 4272
-3839, 635,4131, 639, 202,1507,2195,2766,1345,1435,2572,3726,1908,1184,1181,2457, # 4288
-3727,3134,4362, 843,2611, 437, 916,4669, 234, 769,1884,3046,3047,3623, 833,6187, # 4304
-1639,2250,2402,1355,1185,2010,2047, 999, 525,1732,1290,1488,2612, 948,1578,3728, # 4320
-2413,2477,1216,2725,2159, 334,3840,1328,3624,2921,1525,4132, 564,1056, 891,4363, # 4336
-1444,1698,2385,2251,3729,1365,2281,2235,1717,6188, 864,3841,2515, 444, 527,2767, # 4352
-2922,3625, 544, 461,6189, 566, 209,2437,3398,2098,1065,2068,3331,3626,3257,2137, # 4368  #last 512
-)
-
-
diff --git a/lib/sub_repos/chardet/chardet/jpcntx.py b/lib/sub_repos/chardet/chardet/jpcntx.py
deleted file mode 100644
index 20044e4bc..000000000
--- a/lib/sub_repos/chardet/chardet/jpcntx.py
+++ /dev/null
@@ -1,233 +0,0 @@
-######################## BEGIN LICENSE BLOCK ########################
-# The Original Code is Mozilla Communicator client code.
-#
-# The Initial Developer of the Original Code is
-# Netscape Communications Corporation.
-# Portions created by the Initial Developer are Copyright (C) 1998
-# the Initial Developer. All Rights Reserved.
-#
-# Contributor(s):
-#   Mark Pilgrim - port to Python
-#
-# This library is free software; you can redistribute it and/or
-# modify it under the terms of the GNU Lesser General Public
-# License as published by the Free Software Foundation; either
-# version 2.1 of the License, or (at your option) any later version.
-#
-# This library is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-# Lesser General Public License for more details.
-#
-# You should have received a copy of the GNU Lesser General Public
-# License along with this library; if not, write to the Free Software
-# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
-# 02110-1301  USA
-######################### END LICENSE BLOCK #########################
-
-
-# This is hiragana 2-char sequence table, the number in each cell represents its frequency category
-jp2CharContext = (
-(0,0,0,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,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,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1),
-(2,4,0,4,0,3,0,4,0,3,4,4,4,2,4,3,3,4,3,2,3,3,4,2,3,3,3,2,4,1,4,3,3,1,5,4,3,4,3,4,3,5,3,0,3,5,4,2,0,3,1,0,3,3,0,3,3,0,1,1,0,4,3,0,3,3,0,4,0,2,0,3,5,5,5,5,4,0,4,1,0,3,4),
-(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,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,2),
-(0,4,0,5,0,5,0,4,0,4,5,4,4,3,5,3,5,1,5,3,4,3,4,4,3,4,3,3,4,3,5,4,4,3,5,5,3,5,5,5,3,5,5,3,4,5,5,3,1,3,2,0,3,4,0,4,2,0,4,2,1,5,3,2,3,5,0,4,0,2,0,5,4,4,5,4,5,0,4,0,0,4,4),
-(0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,4,0,3,0,3,0,4,5,4,3,3,3,3,4,3,5,4,4,3,5,4,4,3,4,3,4,4,4,4,5,3,4,4,3,4,5,5,4,5,5,1,4,5,4,3,0,3,3,1,3,3,0,4,4,0,3,3,1,5,3,3,3,5,0,4,0,3,0,4,4,3,4,3,3,0,4,1,1,3,4),
-(0,0,0,0,0,0,0,0,0,0,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,4,0,3,0,3,0,4,0,3,4,4,3,2,2,1,2,1,3,1,3,3,3,3,3,4,3,1,3,3,5,3,3,0,4,3,0,5,4,3,3,5,4,4,3,4,4,5,0,1,2,0,1,2,0,2,2,0,1,0,0,5,2,2,1,4,0,3,0,1,0,4,4,3,5,4,3,0,2,1,0,4,3),
-(0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,3,0,5,0,4,0,2,1,4,4,2,4,1,4,2,4,2,4,3,3,3,4,3,3,3,3,1,4,2,3,3,3,1,4,4,1,1,1,4,3,3,2,0,2,4,3,2,0,3,3,0,3,1,1,0,0,0,3,3,0,4,2,2,3,4,0,4,0,3,0,4,4,5,3,4,4,0,3,0,0,1,4),
-(1,4,0,4,0,4,0,4,0,3,5,4,4,3,4,3,5,4,3,3,4,3,5,4,4,4,4,3,4,2,4,3,3,1,5,4,3,2,4,5,4,5,5,4,4,5,4,4,0,3,2,2,3,3,0,4,3,1,3,2,1,4,3,3,4,5,0,3,0,2,0,4,5,5,4,5,4,0,4,0,0,5,4),
-(0,5,0,5,0,4,0,3,0,4,4,3,4,3,3,3,4,0,4,4,4,3,4,3,4,3,3,1,4,2,4,3,4,0,5,4,1,4,5,4,4,5,3,2,4,3,4,3,2,4,1,3,3,3,2,3,2,0,4,3,3,4,3,3,3,4,0,4,0,3,0,4,5,4,4,4,3,0,4,1,0,1,3),
-(0,3,1,4,0,3,0,2,0,3,4,4,3,1,4,2,3,3,4,3,4,3,4,3,4,4,3,2,3,1,5,4,4,1,4,4,3,5,4,4,3,5,5,4,3,4,4,3,1,2,3,1,2,2,0,3,2,0,3,1,0,5,3,3,3,4,3,3,3,3,4,4,4,4,5,4,2,0,3,3,2,4,3),
-(0,2,0,3,0,1,0,1,0,0,3,2,0,0,2,0,1,0,2,1,3,3,3,1,2,3,1,0,1,0,4,2,1,1,3,3,0,4,3,3,1,4,3,3,0,3,3,2,0,0,0,0,1,0,0,2,0,0,0,0,0,4,1,0,2,3,2,2,2,1,3,3,3,4,4,3,2,0,3,1,0,3,3),
-(0,4,0,4,0,3,0,3,0,4,4,4,3,3,3,3,3,3,4,3,4,2,4,3,4,3,3,2,4,3,4,5,4,1,4,5,3,5,4,5,3,5,4,0,3,5,5,3,1,3,3,2,2,3,0,3,4,1,3,3,2,4,3,3,3,4,0,4,0,3,0,4,5,4,4,5,3,0,4,1,0,3,4),
-(0,2,0,3,0,3,0,0,0,2,2,2,1,0,1,0,0,0,3,0,3,0,3,0,1,3,1,0,3,1,3,3,3,1,3,3,3,0,1,3,1,3,4,0,0,3,1,1,0,3,2,0,0,0,0,1,3,0,1,0,0,3,3,2,0,3,0,0,0,0,0,3,4,3,4,3,3,0,3,0,0,2,3),
-(2,3,0,3,0,2,0,1,0,3,3,4,3,1,3,1,1,1,3,1,4,3,4,3,3,3,0,0,3,1,5,4,3,1,4,3,2,5,5,4,4,4,4,3,3,4,4,4,0,2,1,1,3,2,0,1,2,0,0,1,0,4,1,3,3,3,0,3,0,1,0,4,4,4,5,5,3,0,2,0,0,4,4),
-(0,2,0,1,0,3,1,3,0,2,3,3,3,0,3,1,0,0,3,0,3,2,3,1,3,2,1,1,0,0,4,2,1,0,2,3,1,4,3,2,0,4,4,3,1,3,1,3,0,1,0,0,1,0,0,0,1,0,0,0,0,4,1,1,1,2,0,3,0,0,0,3,4,2,4,3,2,0,1,0,0,3,3),
-(0,1,0,4,0,5,0,4,0,2,4,4,2,3,3,2,3,3,5,3,3,3,4,3,4,2,3,0,4,3,3,3,4,1,4,3,2,1,5,5,3,4,5,1,3,5,4,2,0,3,3,0,1,3,0,4,2,0,1,3,1,4,3,3,3,3,0,3,0,1,0,3,4,4,4,5,5,0,3,0,1,4,5),
-(0,2,0,3,0,3,0,0,0,2,3,1,3,0,4,0,1,1,3,0,3,4,3,2,3,1,0,3,3,2,3,1,3,0,2,3,0,2,1,4,1,2,2,0,0,3,3,0,0,2,0,0,0,1,0,0,0,0,2,2,0,3,2,1,3,3,0,2,0,2,0,0,3,3,1,2,4,0,3,0,2,2,3),
-(2,4,0,5,0,4,0,4,0,2,4,4,4,3,4,3,3,3,1,2,4,3,4,3,4,4,5,0,3,3,3,3,2,0,4,3,1,4,3,4,1,4,4,3,3,4,4,3,1,2,3,0,4,2,0,4,1,0,3,3,0,4,3,3,3,4,0,4,0,2,0,3,5,3,4,5,2,0,3,0,0,4,5),
-(0,3,0,4,0,1,0,1,0,1,3,2,2,1,3,0,3,0,2,0,2,0,3,0,2,0,0,0,1,0,1,1,0,0,3,1,0,0,0,4,0,3,1,0,2,1,3,0,0,0,0,0,0,3,0,0,0,0,0,0,0,4,2,2,3,1,0,3,0,0,0,1,4,4,4,3,0,0,4,0,0,1,4),
-(1,4,1,5,0,3,0,3,0,4,5,4,4,3,5,3,3,4,4,3,4,1,3,3,3,3,2,1,4,1,5,4,3,1,4,4,3,5,4,4,3,5,4,3,3,4,4,4,0,3,3,1,2,3,0,3,1,0,3,3,0,5,4,4,4,4,4,4,3,3,5,4,4,3,3,5,4,0,3,2,0,4,4),
-(0,2,0,3,0,1,0,0,0,1,3,3,3,2,4,1,3,0,3,1,3,0,2,2,1,1,0,0,2,0,4,3,1,0,4,3,0,4,4,4,1,4,3,1,1,3,3,1,0,2,0,0,1,3,0,0,0,0,2,0,0,4,3,2,4,3,5,4,3,3,3,4,3,3,4,3,3,0,2,1,0,3,3),
-(0,2,0,4,0,3,0,2,0,2,5,5,3,4,4,4,4,1,4,3,3,0,4,3,4,3,1,3,3,2,4,3,0,3,4,3,0,3,4,4,2,4,4,0,4,5,3,3,2,2,1,1,1,2,0,1,5,0,3,3,2,4,3,3,3,4,0,3,0,2,0,4,4,3,5,5,0,0,3,0,2,3,3),
-(0,3,0,4,0,3,0,1,0,3,4,3,3,1,3,3,3,0,3,1,3,0,4,3,3,1,1,0,3,0,3,3,0,0,4,4,0,1,5,4,3,3,5,0,3,3,4,3,0,2,0,1,1,1,0,1,3,0,1,2,1,3,3,2,3,3,0,3,0,1,0,1,3,3,4,4,1,0,1,2,2,1,3),
-(0,1,0,4,0,4,0,3,0,1,3,3,3,2,3,1,1,0,3,0,3,3,4,3,2,4,2,0,1,0,4,3,2,0,4,3,0,5,3,3,2,4,4,4,3,3,3,4,0,1,3,0,0,1,0,0,1,0,0,0,0,4,2,3,3,3,0,3,0,0,0,4,4,4,5,3,2,0,3,3,0,3,5),
-(0,2,0,3,0,0,0,3,0,1,3,0,2,0,0,0,1,0,3,1,1,3,3,0,0,3,0,0,3,0,2,3,1,0,3,1,0,3,3,2,0,4,2,2,0,2,0,0,0,4,0,0,0,0,0,0,0,0,0,0,0,2,1,2,0,1,0,1,0,0,0,1,3,1,2,0,0,0,1,0,0,1,4),
-(0,3,0,3,0,5,0,1,0,2,4,3,1,3,3,2,1,1,5,2,1,0,5,1,2,0,0,0,3,3,2,2,3,2,4,3,0,0,3,3,1,3,3,0,2,5,3,4,0,3,3,0,1,2,0,2,2,0,3,2,0,2,2,3,3,3,0,2,0,1,0,3,4,4,2,5,4,0,3,0,0,3,5),
-(0,3,0,3,0,3,0,1,0,3,3,3,3,0,3,0,2,0,2,1,1,0,2,0,1,0,0,0,2,1,0,0,1,0,3,2,0,0,3,3,1,2,3,1,0,3,3,0,0,1,0,0,0,0,0,2,0,0,0,0,0,2,3,1,2,3,0,3,0,1,0,3,2,1,0,4,3,0,1,1,0,3,3),
-(0,4,0,5,0,3,0,3,0,4,5,5,4,3,5,3,4,3,5,3,3,2,5,3,4,4,4,3,4,3,4,5,5,3,4,4,3,4,4,5,4,4,4,3,4,5,5,4,2,3,4,2,3,4,0,3,3,1,4,3,2,4,3,3,5,5,0,3,0,3,0,5,5,5,5,4,4,0,4,0,1,4,4),
-(0,4,0,4,0,3,0,3,0,3,5,4,4,2,3,2,5,1,3,2,5,1,4,2,3,2,3,3,4,3,3,3,3,2,5,4,1,3,3,5,3,4,4,0,4,4,3,1,1,3,1,0,2,3,0,2,3,0,3,0,0,4,3,1,3,4,0,3,0,2,0,4,4,4,3,4,5,0,4,0,0,3,4),
-(0,3,0,3,0,3,1,2,0,3,4,4,3,3,3,0,2,2,4,3,3,1,3,3,3,1,1,0,3,1,4,3,2,3,4,4,2,4,4,4,3,4,4,3,2,4,4,3,1,3,3,1,3,3,0,4,1,0,2,2,1,4,3,2,3,3,5,4,3,3,5,4,4,3,3,0,4,0,3,2,2,4,4),
-(0,2,0,1,0,0,0,0,0,1,2,1,3,0,0,0,0,0,2,0,1,2,1,0,0,1,0,0,0,0,3,0,0,1,0,1,1,3,1,0,0,0,1,1,0,1,1,0,0,0,0,0,2,0,0,0,0,0,0,0,0,1,1,2,2,0,3,4,0,0,0,1,1,0,0,1,0,0,0,0,0,1,1),
-(0,1,0,0,0,1,0,0,0,0,4,0,4,1,4,0,3,0,4,0,3,0,4,0,3,0,3,0,4,1,5,1,4,0,0,3,0,5,0,5,2,0,1,0,0,0,2,1,4,0,1,3,0,0,3,0,0,3,1,1,4,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0),
-(1,4,0,5,0,3,0,2,0,3,5,4,4,3,4,3,5,3,4,3,3,0,4,3,3,3,3,3,3,2,4,4,3,1,3,4,4,5,4,4,3,4,4,1,3,5,4,3,3,3,1,2,2,3,3,1,3,1,3,3,3,5,3,3,4,5,0,3,0,3,0,3,4,3,4,4,3,0,3,0,2,4,3),
-(0,1,0,4,0,0,0,0,0,1,4,0,4,1,4,2,4,0,3,0,1,0,1,0,0,0,0,0,2,0,3,1,1,1,0,3,0,0,0,1,2,1,0,0,1,1,1,1,0,1,0,0,0,1,0,0,3,0,0,0,0,3,2,0,2,2,0,1,0,0,0,2,3,2,3,3,0,0,0,0,2,1,0),
-(0,5,1,5,0,3,0,3,0,5,4,4,5,1,5,3,3,0,4,3,4,3,5,3,4,3,3,2,4,3,4,3,3,0,3,3,1,4,4,3,4,4,4,3,4,5,5,3,2,3,1,1,3,3,1,3,1,1,3,3,2,4,5,3,3,5,0,4,0,3,0,4,4,3,5,3,3,0,3,4,0,4,3),
-(0,5,0,5,0,3,0,2,0,4,4,3,5,2,4,3,3,3,4,4,4,3,5,3,5,3,3,1,4,0,4,3,3,0,3,3,0,4,4,4,4,5,4,3,3,5,5,3,2,3,1,2,3,2,0,1,0,0,3,2,2,4,4,3,1,5,0,4,0,3,0,4,3,1,3,2,1,0,3,3,0,3,3),
-(0,4,0,5,0,5,0,4,0,4,5,5,5,3,4,3,3,2,5,4,4,3,5,3,5,3,4,0,4,3,4,4,3,2,4,4,3,4,5,4,4,5,5,0,3,5,5,4,1,3,3,2,3,3,1,3,1,0,4,3,1,4,4,3,4,5,0,4,0,2,0,4,3,4,4,3,3,0,4,0,0,5,5),
-(0,4,0,4,0,5,0,1,1,3,3,4,4,3,4,1,3,0,5,1,3,0,3,1,3,1,1,0,3,0,3,3,4,0,4,3,0,4,4,4,3,4,4,0,3,5,4,1,0,3,0,0,2,3,0,3,1,0,3,1,0,3,2,1,3,5,0,3,0,1,0,3,2,3,3,4,4,0,2,2,0,4,4),
-(2,4,0,5,0,4,0,3,0,4,5,5,4,3,5,3,5,3,5,3,5,2,5,3,4,3,3,4,3,4,5,3,2,1,5,4,3,2,3,4,5,3,4,1,2,5,4,3,0,3,3,0,3,2,0,2,3,0,4,1,0,3,4,3,3,5,0,3,0,1,0,4,5,5,5,4,3,0,4,2,0,3,5),
-(0,5,0,4,0,4,0,2,0,5,4,3,4,3,4,3,3,3,4,3,4,2,5,3,5,3,4,1,4,3,4,4,4,0,3,5,0,4,4,4,4,5,3,1,3,4,5,3,3,3,3,3,3,3,0,2,2,0,3,3,2,4,3,3,3,5,3,4,1,3,3,5,3,2,0,0,0,0,4,3,1,3,3),
-(0,1,0,3,0,3,0,1,0,1,3,3,3,2,3,3,3,0,3,0,0,0,3,1,3,0,0,0,2,2,2,3,0,0,3,2,0,1,2,4,1,3,3,0,0,3,3,3,0,1,0,0,2,1,0,0,3,0,3,1,0,3,0,0,1,3,0,2,0,1,0,3,3,1,3,3,0,0,1,1,0,3,3),
-(0,2,0,3,0,2,1,4,0,2,2,3,1,1,3,1,1,0,2,0,3,1,2,3,1,3,0,0,1,0,4,3,2,3,3,3,1,4,2,3,3,3,3,1,0,3,1,4,0,1,1,0,1,2,0,1,1,0,1,1,0,3,1,3,2,2,0,1,0,0,0,2,3,3,3,1,0,0,0,0,0,2,3),
-(0,5,0,4,0,5,0,2,0,4,5,5,3,3,4,3,3,1,5,4,4,2,4,4,4,3,4,2,4,3,5,5,4,3,3,4,3,3,5,5,4,5,5,1,3,4,5,3,1,4,3,1,3,3,0,3,3,1,4,3,1,4,5,3,3,5,0,4,0,3,0,5,3,3,1,4,3,0,4,0,1,5,3),
-(0,5,0,5,0,4,0,2,0,4,4,3,4,3,3,3,3,3,5,4,4,4,4,4,4,5,3,3,5,2,4,4,4,3,4,4,3,3,4,4,5,5,3,3,4,3,4,3,3,4,3,3,3,3,1,2,2,1,4,3,3,5,4,4,3,4,0,4,0,3,0,4,4,4,4,4,1,0,4,2,0,2,4),
-(0,4,0,4,0,3,0,1,0,3,5,2,3,0,3,0,2,1,4,2,3,3,4,1,4,3,3,2,4,1,3,3,3,0,3,3,0,0,3,3,3,5,3,3,3,3,3,2,0,2,0,0,2,0,0,2,0,0,1,0,0,3,1,2,2,3,0,3,0,2,0,4,4,3,3,4,1,0,3,0,0,2,4),
-(0,0,0,4,0,0,0,0,0,0,1,0,1,0,2,0,0,0,0,0,1,0,2,0,1,0,0,0,0,0,3,1,3,0,3,2,0,0,0,1,0,3,2,0,0,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,3,4,0,2,0,0,0,0,0,0,2),
-(0,2,1,3,0,2,0,2,0,3,3,3,3,1,3,1,3,3,3,3,3,3,4,2,2,1,2,1,4,0,4,3,1,3,3,3,2,4,3,5,4,3,3,3,3,3,3,3,0,1,3,0,2,0,0,1,0,0,1,0,0,4,2,0,2,3,0,3,3,0,3,3,4,2,3,1,4,0,1,2,0,2,3),
-(0,3,0,3,0,1,0,3,0,2,3,3,3,0,3,1,2,0,3,3,2,3,3,2,3,2,3,1,3,0,4,3,2,0,3,3,1,4,3,3,2,3,4,3,1,3,3,1,1,0,1,1,0,1,0,1,0,1,0,0,0,4,1,1,0,3,0,3,1,0,2,3,3,3,3,3,1,0,0,2,0,3,3),
-(0,0,0,0,0,0,0,0,0,0,3,0,2,0,3,0,0,0,0,0,0,0,3,0,0,0,0,0,0,0,3,0,3,0,3,1,0,1,0,1,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,3,0,2,0,2,3,0,0,0,0,0,0,0,0,3),
-(0,2,0,3,1,3,0,3,0,2,3,3,3,1,3,1,3,1,3,1,3,3,3,1,3,0,2,3,1,1,4,3,3,2,3,3,1,2,2,4,1,3,3,0,1,4,2,3,0,1,3,0,3,0,0,1,3,0,2,0,0,3,3,2,1,3,0,3,0,2,0,3,4,4,4,3,1,0,3,0,0,3,3),
-(0,2,0,1,0,2,0,0,0,1,3,2,2,1,3,0,1,1,3,0,3,2,3,1,2,0,2,0,1,1,3,3,3,0,3,3,1,1,2,3,2,3,3,1,2,3,2,0,0,1,0,0,0,0,0,0,3,0,1,0,0,2,1,2,1,3,0,3,0,0,0,3,4,4,4,3,2,0,2,0,0,2,4),
-(0,0,0,1,0,1,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,2,2,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,1,0,0,0,0,1,3,1,0,0,0,0,0,0,0,3),
-(0,3,0,3,0,2,0,3,0,3,3,3,2,3,2,2,2,0,3,1,3,3,3,2,3,3,0,0,3,0,3,2,2,0,2,3,1,4,3,4,3,3,2,3,1,5,4,4,0,3,1,2,1,3,0,3,1,1,2,0,2,3,1,3,1,3,0,3,0,1,0,3,3,4,4,2,1,0,2,1,0,2,4),
-(0,1,0,3,0,1,0,2,0,1,4,2,5,1,4,0,2,0,2,1,3,1,4,0,2,1,0,0,2,1,4,1,1,0,3,3,0,5,1,3,2,3,3,1,0,3,2,3,0,1,0,0,0,0,0,0,1,0,0,0,0,4,0,1,0,3,0,2,0,1,0,3,3,3,4,3,3,0,0,0,0,2,3),
-(0,0,0,1,0,0,0,0,0,0,2,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,3,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,2,1,0,0,1,0,0,0,0,0,3),
-(0,1,0,3,0,4,0,3,0,2,4,3,1,0,3,2,2,1,3,1,2,2,3,1,1,1,2,1,3,0,1,2,0,1,3,2,1,3,0,5,5,1,0,0,1,3,2,1,0,3,0,0,1,0,0,0,0,0,3,4,0,1,1,1,3,2,0,2,0,1,0,2,3,3,1,2,3,0,1,0,1,0,4),
-(0,0,0,1,0,3,0,3,0,2,2,1,0,0,4,0,3,0,3,1,3,0,3,0,3,0,1,0,3,0,3,1,3,0,3,3,0,0,1,2,1,1,1,0,1,2,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,2,2,1,2,0,0,2,0,0,0,0,2,3,3,3,3,0,0,0,0,1,4),
-(0,0,0,3,0,3,0,0,0,0,3,1,1,0,3,0,1,0,2,0,1,0,0,0,0,0,0,0,1,0,3,0,2,0,2,3,0,0,2,2,3,1,2,0,0,1,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,3,0,0,2,0,0,0,0,2,3),
-(2,4,0,5,0,5,0,4,0,3,4,3,3,3,4,3,3,3,4,3,4,4,5,4,5,5,5,2,3,0,5,5,4,1,5,4,3,1,5,4,3,4,4,3,3,4,3,3,0,3,2,0,2,3,0,3,0,0,3,3,0,5,3,2,3,3,0,3,0,3,0,3,4,5,4,5,3,0,4,3,0,3,4),
-(0,3,0,3,0,3,0,3,0,3,3,4,3,2,3,2,3,0,4,3,3,3,3,3,3,3,3,0,3,2,4,3,3,1,3,4,3,4,4,4,3,4,4,3,2,4,4,1,0,2,0,0,1,1,0,2,0,0,3,1,0,5,3,2,1,3,0,3,0,1,2,4,3,2,4,3,3,0,3,2,0,4,4),
-(0,3,0,3,0,1,0,0,0,1,4,3,3,2,3,1,3,1,4,2,3,2,4,2,3,4,3,0,2,2,3,3,3,0,3,3,3,0,3,4,1,3,3,0,3,4,3,3,0,1,1,0,1,0,0,0,4,0,3,0,0,3,1,2,1,3,0,4,0,1,0,4,3,3,4,3,3,0,2,0,0,3,3),
-(0,3,0,4,0,1,0,3,0,3,4,3,3,0,3,3,3,1,3,1,3,3,4,3,3,3,0,0,3,1,5,3,3,1,3,3,2,5,4,3,3,4,5,3,2,5,3,4,0,1,0,0,0,0,0,2,0,0,1,1,0,4,2,2,1,3,0,3,0,2,0,4,4,3,5,3,2,0,1,1,0,3,4),
-(0,5,0,4,0,5,0,2,0,4,4,3,3,2,3,3,3,1,4,3,4,1,5,3,4,3,4,0,4,2,4,3,4,1,5,4,0,4,4,4,4,5,4,1,3,5,4,2,1,4,1,1,3,2,0,3,1,0,3,2,1,4,3,3,3,4,0,4,0,3,0,4,4,4,3,3,3,0,4,2,0,3,4),
-(1,4,0,4,0,3,0,1,0,3,3,3,1,1,3,3,2,2,3,3,1,0,3,2,2,1,2,0,3,1,2,1,2,0,3,2,0,2,2,3,3,4,3,0,3,3,1,2,0,1,1,3,1,2,0,0,3,0,1,1,0,3,2,2,3,3,0,3,0,0,0,2,3,3,4,3,3,0,1,0,0,1,4),
-(0,4,0,4,0,4,0,0,0,3,4,4,3,1,4,2,3,2,3,3,3,1,4,3,4,0,3,0,4,2,3,3,2,2,5,4,2,1,3,4,3,4,3,1,3,3,4,2,0,2,1,0,3,3,0,0,2,0,3,1,0,4,4,3,4,3,0,4,0,1,0,2,4,4,4,4,4,0,3,2,0,3,3),
-(0,0,0,1,0,4,0,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,3,2,0,0,1,0,0,0,1,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,1,0,0,0,0,0,2),
-(0,2,0,3,0,4,0,4,0,1,3,3,3,0,4,0,2,1,2,1,1,1,2,0,3,1,1,0,1,0,3,1,0,0,3,3,2,0,1,1,0,0,0,0,0,1,0,2,0,2,2,0,3,1,0,0,1,0,1,1,0,1,2,0,3,0,0,0,0,1,0,0,3,3,4,3,1,0,1,0,3,0,2),
-(0,0,0,3,0,5,0,0,0,0,1,0,2,0,3,1,0,1,3,0,0,0,2,0,0,0,1,0,0,0,1,1,0,0,4,0,0,0,2,3,0,1,4,1,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,3,0,0,0,0,0,1,0,0,0,0,0,0,0,2,0,0,3,0,0,0,0,0,3),
-(0,2,0,5,0,5,0,1,0,2,4,3,3,2,5,1,3,2,3,3,3,0,4,1,2,0,3,0,4,0,2,2,1,1,5,3,0,0,1,4,2,3,2,0,3,3,3,2,0,2,4,1,1,2,0,1,1,0,3,1,0,1,3,1,2,3,0,2,0,0,0,1,3,5,4,4,4,0,3,0,0,1,3),
-(0,4,0,5,0,4,0,4,0,4,5,4,3,3,4,3,3,3,4,3,4,4,5,3,4,5,4,2,4,2,3,4,3,1,4,4,1,3,5,4,4,5,5,4,4,5,5,5,2,3,3,1,4,3,1,3,3,0,3,3,1,4,3,4,4,4,0,3,0,4,0,3,3,4,4,5,0,0,4,3,0,4,5),
-(0,4,0,4,0,3,0,3,0,3,4,4,4,3,3,2,4,3,4,3,4,3,5,3,4,3,2,1,4,2,4,4,3,1,3,4,2,4,5,5,3,4,5,4,1,5,4,3,0,3,2,2,3,2,1,3,1,0,3,3,3,5,3,3,3,5,4,4,2,3,3,4,3,3,3,2,1,0,3,2,1,4,3),
-(0,4,0,5,0,4,0,3,0,3,5,5,3,2,4,3,4,0,5,4,4,1,4,4,4,3,3,3,4,3,5,5,2,3,3,4,1,2,5,5,3,5,5,2,3,5,5,4,0,3,2,0,3,3,1,1,5,1,4,1,0,4,3,2,3,5,0,4,0,3,0,5,4,3,4,3,0,0,4,1,0,4,4),
-(1,3,0,4,0,2,0,2,0,2,5,5,3,3,3,3,3,0,4,2,3,4,4,4,3,4,0,0,3,4,5,4,3,3,3,3,2,5,5,4,5,5,5,4,3,5,5,5,1,3,1,0,1,0,0,3,2,0,4,2,0,5,2,3,2,4,1,3,0,3,0,4,5,4,5,4,3,0,4,2,0,5,4),
-(0,3,0,4,0,5,0,3,0,3,4,4,3,2,3,2,3,3,3,3,3,2,4,3,3,2,2,0,3,3,3,3,3,1,3,3,3,0,4,4,3,4,4,1,1,4,4,2,0,3,1,0,1,1,0,4,1,0,2,3,1,3,3,1,3,4,0,3,0,1,0,3,1,3,0,0,1,0,2,0,0,4,4),
-(0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,3,0,2,0,3,0,1,5,4,3,3,3,1,4,2,1,2,3,4,4,2,4,4,5,0,3,1,4,3,4,0,4,3,3,3,2,3,2,5,3,4,3,2,2,3,0,0,3,0,2,1,0,1,2,0,0,0,0,2,1,1,3,1,0,2,0,4,0,3,4,4,4,5,2,0,2,0,0,1,3),
-(0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,1,1,1,0,0,1,1,0,0,0,4,2,1,1,0,1,0,3,2,0,0,3,1,1,1,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,0,1,0,0,0,2,0,0,0,1,4,0,4,2,1,0,0,0,0,0,1),
-(0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,1,0,0,0,0,0,0,1,0,1,0,0,0,0,3,1,0,0,0,2,0,2,1,0,0,1,2,1,0,1,1,0,0,3,0,0,0,0,0,0,0,0,0,0,0,1,3,1,0,0,0,0,0,1,0,0,2,1,0,0,0,0,0,0,0,0,2),
-(0,4,0,4,0,4,0,3,0,4,4,3,4,2,4,3,2,0,4,4,4,3,5,3,5,3,3,2,4,2,4,3,4,3,1,4,0,2,3,4,4,4,3,3,3,4,4,4,3,4,1,3,4,3,2,1,2,1,3,3,3,4,4,3,3,5,0,4,0,3,0,4,3,3,3,2,1,0,3,0,0,3,3),
-(0,4,0,3,0,3,0,3,0,3,5,5,3,3,3,3,4,3,4,3,3,3,4,4,4,3,3,3,3,4,3,5,3,3,1,3,2,4,5,5,5,5,4,3,4,5,5,3,2,2,3,3,3,3,2,3,3,1,2,3,2,4,3,3,3,4,0,4,0,2,0,4,3,2,2,1,2,0,3,0,0,4,1),
-)
-
-class JapaneseContextAnalysis(object):
-    NUM_OF_CATEGORY = 6
-    DONT_KNOW = -1
-    ENOUGH_REL_THRESHOLD = 100
-    MAX_REL_THRESHOLD = 1000
-    MINIMUM_DATA_THRESHOLD = 4
-
-    def __init__(self):
-        self._total_rel = None
-        self._rel_sample = None
-        self._need_to_skip_char_num = None
-        self._last_char_order = None
-        self._done = None
-        self.reset()
-
-    def reset(self):
-        self._total_rel = 0  # total sequence received
-        # category counters, each integer counts sequence in its category
-        self._rel_sample = [0] * self.NUM_OF_CATEGORY
-        # if last byte in current buffer is not the last byte of a character,
-        # we need to know how many bytes to skip in next buffer
-        self._need_to_skip_char_num = 0
-        self._last_char_order = -1  # The order of previous char
-        # If this flag is set to True, detection is done and conclusion has
-        # been made
-        self._done = False
-
-    def feed(self, byte_str, num_bytes):
-        if self._done:
-            return
-
-        # The buffer we got is byte oriented, and a character may span in more than one
-        # buffers. In case the last one or two byte in last buffer is not
-        # complete, we record how many byte needed to complete that character
-        # and skip these bytes here.  We can choose to record those bytes as
-        # well and analyse the character once it is complete, but since a
-        # character will not make much difference, by simply skipping
-        # this character will simply our logic and improve performance.
-        i = self._need_to_skip_char_num
-        while i < num_bytes:
-            order, char_len = self.get_order(byte_str[i:i + 2])
-            i += char_len
-            if i > num_bytes:
-                self._need_to_skip_char_num = i - num_bytes
-                self._last_char_order = -1
-            else:
-                if (order != -1) and (self._last_char_order != -1):
-                    self._total_rel += 1
-                    if self._total_rel > self.MAX_REL_THRESHOLD:
-                        self._done = True
-                        break
-                    self._rel_sample[jp2CharContext[self._last_char_order][order]] += 1
-                self._last_char_order = order
-
-    def got_enough_data(self):
-        return self._total_rel > self.ENOUGH_REL_THRESHOLD
-
-    def get_confidence(self):
-        # This is just one way to calculate confidence. It works well for me.
-        if self._total_rel > self.MINIMUM_DATA_THRESHOLD:
-            return (self._total_rel - self._rel_sample[0]) / self._total_rel
-        else:
-            return self.DONT_KNOW
-
-    def get_order(self, byte_str):
-        return -1, 1
-
-class SJISContextAnalysis(JapaneseContextAnalysis):
-    def __init__(self):
-        super(SJISContextAnalysis, self).__init__()
-        self._charset_name = "SHIFT_JIS"
-
-    @property
-    def charset_name(self):
-        return self._charset_name
-
-    def get_order(self, byte_str):
-        if not byte_str:
-            return -1, 1
-        # find out current char's byte length
-        first_char = byte_str[0]
-        if (0x81 <= first_char <= 0x9F) or (0xE0 <= first_char <= 0xFC):
-            char_len = 2
-            if (first_char == 0x87) or (0xFA <= first_char <= 0xFC):
-                self._charset_name = "CP932"
-        else:
-            char_len = 1
-
-        # return its order if it is hiragana
-        if len(byte_str) > 1:
-            second_char = byte_str[1]
-            if (first_char == 202) and (0x9F <= second_char <= 0xF1):
-                return second_char - 0x9F, char_len
-
-        return -1, char_len
-
-class EUCJPContextAnalysis(JapaneseContextAnalysis):
-    def get_order(self, byte_str):
-        if not byte_str:
-            return -1, 1
-        # find out current char's byte length
-        first_char = byte_str[0]
-        if (first_char == 0x8E) or (0xA1 <= first_char <= 0xFE):
-            char_len = 2
-        elif first_char == 0x8F:
-            char_len = 3
-        else:
-            char_len = 1
-
-        # return its order if it is hiragana
-        if len(byte_str) > 1:
-            second_char = byte_str[1]
-            if (first_char == 0xA4) and (0xA1 <= second_char <= 0xF3):
-                return second_char - 0xA1, char_len
-
-        return -1, char_len
-
-
diff --git a/lib/sub_repos/chardet/chardet/langbulgarianmodel.py b/lib/sub_repos/chardet/chardet/langbulgarianmodel.py
deleted file mode 100644
index 561bfd905..000000000
--- a/lib/sub_repos/chardet/chardet/langbulgarianmodel.py
+++ /dev/null
@@ -1,4650 +0,0 @@
-#!/usr/bin/env python
-# -*- coding: utf-8 -*-
-
-from chardet.sbcharsetprober import SingleByteCharSetModel
-
-
-# 3: Positive
-# 2: Likely
-# 1: Unlikely
-# 0: Negative
-
-BULGARIAN_LANG_MODEL = {
-    63: {  # 'e'
-        63: 1,  # 'e'
-        45: 0,  # '\xad'
-        31: 0,  # 'Ð'
-        32: 0,  # 'Б'
-        35: 0,  # 'Ð’'
-        43: 0,  # 'Г'
-        37: 0,  # 'Д'
-        44: 0,  # 'Е'
-        55: 0,  # 'Ж'
-        47: 0,  # 'З'
-        40: 0,  # 'И'
-        59: 0,  # 'Й'
-        33: 0,  # 'К'
-        46: 0,  # 'Л'
-        38: 0,  # 'М'
-        36: 0,  # 'Ð'
-        41: 0,  # 'О'
-        30: 0,  # 'П'
-        39: 0,  # 'Р'
-        28: 0,  # 'С'
-        34: 0,  # 'Т'
-        51: 0,  # 'У'
-        48: 0,  # 'Ф'
-        49: 0,  # 'Ð¥'
-        53: 0,  # 'Ц'
-        50: 0,  # 'Ч'
-        54: 0,  # 'Ш'
-        57: 0,  # 'Щ'
-        61: 0,  # 'Ъ'
-        60: 0,  # 'Ю'
-        56: 0,  # 'Я'
-        1: 0,  # 'а'
-        18: 1,  # 'б'
-        9: 1,  # 'в'
-        20: 1,  # 'г'
-        11: 1,  # 'д'
-        3: 1,  # 'е'
-        23: 1,  # 'ж'
-        15: 1,  # 'з'
-        2: 0,  # 'и'
-        26: 1,  # 'й'
-        12: 1,  # 'к'
-        10: 1,  # 'л'
-        14: 1,  # 'м'
-        6: 1,  # 'н'
-        4: 1,  # 'о'
-        13: 1,  # 'п'
-        7: 1,  # 'Ñ€'
-        8: 1,  # 'Ñ'
-        5: 1,  # 'Ñ‚'
-        19: 0,  # 'у'
-        29: 1,  # 'Ñ„'
-        25: 1,  # 'Ñ…'
-        22: 0,  # 'ц'
-        21: 1,  # 'ч'
-        27: 1,  # 'ш'
-        24: 1,  # 'щ'
-        17: 0,  # 'ÑŠ'
-        52: 0,  # 'ь'
-        42: 0,  # 'ÑŽ'
-        16: 1,  # 'Ñ'
-        58: 0,  # 'Ñ”'
-        62: 0,  # 'â„–'
-    },
-    45: {  # '\xad'
-        63: 0,  # 'e'
-        45: 0,  # '\xad'
-        31: 0,  # 'Ð'
-        32: 1,  # 'Б'
-        35: 1,  # 'Ð’'
-        43: 0,  # 'Г'
-        37: 1,  # 'Д'
-        44: 0,  # 'Е'
-        55: 0,  # 'Ж'
-        47: 0,  # 'З'
-        40: 1,  # 'И'
-        59: 0,  # 'Й'
-        33: 1,  # 'К'
-        46: 0,  # 'Л'
-        38: 1,  # 'М'
-        36: 0,  # 'Ð'
-        41: 1,  # 'О'
-        30: 1,  # 'П'
-        39: 1,  # 'Р'
-        28: 1,  # 'С'
-        34: 0,  # 'Т'
-        51: 0,  # 'У'
-        48: 0,  # 'Ф'
-        49: 1,  # 'Ð¥'
-        53: 0,  # 'Ц'
-        50: 0,  # 'Ч'
-        54: 0,  # 'Ш'
-        57: 0,  # 'Щ'
-        61: 0,  # 'Ъ'
-        60: 0,  # 'Ю'
-        56: 0,  # 'Я'
-        1: 0,  # 'а'
-        18: 0,  # 'б'
-        9: 0,  # 'в'
-        20: 0,  # 'г'
-        11: 0,  # 'д'
-        3: 0,  # 'е'
-        23: 0,  # 'ж'
-        15: 0,  # 'з'
-        2: 0,  # 'и'
-        26: 0,  # 'й'
-        12: 0,  # 'к'
-        10: 0,  # 'л'
-        14: 0,  # 'м'
-        6: 0,  # 'н'
-        4: 0,  # 'о'
-        13: 0,  # 'п'
-        7: 0,  # 'Ñ€'
-        8: 0,  # 'Ñ'
-        5: 0,  # 'Ñ‚'
-        19: 0,  # 'у'
-        29: 0,  # 'Ñ„'
-        25: 0,  # 'Ñ…'
-        22: 0,  # 'ц'
-        21: 0,  # 'ч'
-        27: 0,  # 'ш'
-        24: 0,  # 'щ'
-        17: 0,  # 'ÑŠ'
-        52: 0,  # 'ь'
-        42: 0,  # 'ÑŽ'
-        16: 0,  # 'Ñ'
-        58: 0,  # 'Ñ”'
-        62: 0,  # 'â„–'
-    },
-    31: {  # 'Ð'
-        63: 0,  # 'e'
-        45: 1,  # '\xad'
-        31: 1,  # 'Ð'
-        32: 1,  # 'Б'
-        35: 2,  # 'Ð’'
-        43: 1,  # 'Г'
-        37: 2,  # 'Д'
-        44: 2,  # 'Е'
-        55: 1,  # 'Ж'
-        47: 2,  # 'З'
-        40: 1,  # 'И'
-        59: 1,  # 'Й'
-        33: 1,  # 'К'
-        46: 2,  # 'Л'
-        38: 1,  # 'М'
-        36: 2,  # 'Ð'
-        41: 1,  # 'О'
-        30: 2,  # 'П'
-        39: 2,  # 'Р'
-        28: 2,  # 'С'
-        34: 2,  # 'Т'
-        51: 1,  # 'У'
-        48: 2,  # 'Ф'
-        49: 1,  # 'Ð¥'
-        53: 1,  # 'Ц'
-        50: 1,  # 'Ч'
-        54: 1,  # 'Ш'
-        57: 2,  # 'Щ'
-        61: 0,  # 'Ъ'
-        60: 0,  # 'Ю'
-        56: 1,  # 'Я'
-        1: 1,  # 'а'
-        18: 2,  # 'б'
-        9: 2,  # 'в'
-        20: 2,  # 'г'
-        11: 2,  # 'д'
-        3: 1,  # 'е'
-        23: 1,  # 'ж'
-        15: 2,  # 'з'
-        2: 0,  # 'и'
-        26: 2,  # 'й'
-        12: 2,  # 'к'
-        10: 3,  # 'л'
-        14: 2,  # 'м'
-        6: 3,  # 'н'
-        4: 0,  # 'о'
-        13: 2,  # 'п'
-        7: 2,  # 'Ñ€'
-        8: 2,  # 'Ñ'
-        5: 2,  # 'Ñ‚'
-        19: 1,  # 'у'
-        29: 2,  # 'Ñ„'
-        25: 1,  # 'Ñ…'
-        22: 1,  # 'ц'
-        21: 1,  # 'ч'
-        27: 1,  # 'ш'
-        24: 0,  # 'щ'
-        17: 0,  # 'ÑŠ'
-        52: 0,  # 'ь'
-        42: 0,  # 'ÑŽ'
-        16: 1,  # 'Ñ'
-        58: 0,  # 'Ñ”'
-        62: 0,  # 'â„–'
-    },
-    32: {  # 'Б'
-        63: 0,  # 'e'
-        45: 0,  # '\xad'
-        31: 2,  # 'Ð'
-        32: 2,  # 'Б'
-        35: 1,  # 'Ð’'
-        43: 1,  # 'Г'
-        37: 2,  # 'Д'
-        44: 1,  # 'Е'
-        55: 1,  # 'Ж'
-        47: 2,  # 'З'
-        40: 1,  # 'И'
-        59: 0,  # 'Й'
-        33: 1,  # 'К'
-        46: 1,  # 'Л'
-        38: 1,  # 'М'
-        36: 2,  # 'Ð'
-        41: 2,  # 'О'
-        30: 1,  # 'П'
-        39: 1,  # 'Р'
-        28: 2,  # 'С'
-        34: 2,  # 'Т'
-        51: 1,  # 'У'
-        48: 2,  # 'Ф'
-        49: 1,  # 'Ð¥'
-        53: 1,  # 'Ц'
-        50: 1,  # 'Ч'
-        54: 0,  # 'Ш'
-        57: 1,  # 'Щ'
-        61: 2,  # 'Ъ'
-        60: 1,  # 'Ю'
-        56: 1,  # 'Я'
-        1: 3,  # 'а'
-        18: 0,  # 'б'
-        9: 0,  # 'в'
-        20: 0,  # 'г'
-        11: 1,  # 'д'
-        3: 3,  # 'е'
-        23: 0,  # 'ж'
-        15: 0,  # 'з'
-        2: 2,  # 'и'
-        26: 0,  # 'й'
-        12: 0,  # 'к'
-        10: 2,  # 'л'
-        14: 0,  # 'м'
-        6: 0,  # 'н'
-        4: 3,  # 'о'
-        13: 0,  # 'п'
-        7: 2,  # 'Ñ€'
-        8: 1,  # 'Ñ'
-        5: 0,  # 'Ñ‚'
-        19: 2,  # 'у'
-        29: 0,  # 'Ñ„'
-        25: 1,  # 'Ñ…'
-        22: 0,  # 'ц'
-        21: 0,  # 'ч'
-        27: 0,  # 'ш'
-        24: 0,  # 'щ'
-        17: 3,  # 'ÑŠ'
-        52: 1,  # 'ь'
-        42: 1,  # 'ÑŽ'
-        16: 2,  # 'Ñ'
-        58: 0,  # 'Ñ”'
-        62: 0,  # 'â„–'
-    },
-    35: {  # 'Ð’'
-        63: 0,  # 'e'
-        45: 0,  # '\xad'
-        31: 2,  # 'Ð'
-        32: 1,  # 'Б'
-        35: 1,  # 'Ð’'
-        43: 0,  # 'Г'
-        37: 1,  # 'Д'
-        44: 2,  # 'Е'
-        55: 0,  # 'Ж'
-        47: 0,  # 'З'
-        40: 2,  # 'И'
-        59: 0,  # 'Й'
-        33: 1,  # 'К'
-        46: 1,  # 'Л'
-        38: 1,  # 'М'
-        36: 1,  # 'Ð'
-        41: 1,  # 'О'
-        30: 1,  # 'П'
-        39: 2,  # 'Р'
-        28: 2,  # 'С'
-        34: 1,  # 'Т'
-        51: 1,  # 'У'
-        48: 2,  # 'Ф'
-        49: 0,  # 'Ð¥'
-        53: 1,  # 'Ц'
-        50: 0,  # 'Ч'
-        54: 0,  # 'Ш'
-        57: 0,  # 'Щ'
-        61: 1,  # 'Ъ'
-        60: 1,  # 'Ю'
-        56: 2,  # 'Я'
-        1: 3,  # 'а'
-        18: 1,  # 'б'
-        9: 0,  # 'в'
-        20: 0,  # 'г'
-        11: 1,  # 'д'
-        3: 3,  # 'е'
-        23: 1,  # 'ж'
-        15: 2,  # 'з'
-        2: 3,  # 'и'
-        26: 0,  # 'й'
-        12: 1,  # 'к'
-        10: 2,  # 'л'
-        14: 1,  # 'м'
-        6: 2,  # 'н'
-        4: 2,  # 'о'
-        13: 1,  # 'п'
-        7: 2,  # 'Ñ€'
-        8: 2,  # 'Ñ'
-        5: 2,  # 'Ñ‚'
-        19: 1,  # 'у'
-        29: 0,  # 'Ñ„'
-        25: 1,  # 'Ñ…'
-        22: 0,  # 'ц'
-        21: 2,  # 'ч'
-        27: 0,  # 'ш'
-        24: 0,  # 'щ'
-        17: 2,  # 'ÑŠ'
-        52: 1,  # 'ь'
-        42: 1,  # 'ÑŽ'
-        16: 1,  # 'Ñ'
-        58: 0,  # 'Ñ”'
-        62: 0,  # 'â„–'
-    },
-    43: {  # 'Г'
-        63: 0,  # 'e'
-        45: 0,  # '\xad'
-        31: 2,  # 'Ð'
-        32: 1,  # 'Б'
-        35: 0,  # 'Ð’'
-        43: 0,  # 'Г'
-        37: 1,  # 'Д'
-        44: 2,  # 'Е'
-        55: 0,  # 'Ж'
-        47: 1,  # 'З'
-        40: 1,  # 'И'
-        59: 0,  # 'Й'
-        33: 1,  # 'К'
-        46: 1,  # 'Л'
-        38: 0,  # 'М'
-        36: 1,  # 'Ð'
-        41: 1,  # 'О'
-        30: 0,  # 'П'
-        39: 1,  # 'Р'
-        28: 1,  # 'С'
-        34: 0,  # 'Т'
-        51: 1,  # 'У'
-        48: 1,  # 'Ф'
-        49: 0,  # 'Ð¥'
-        53: 0,  # 'Ц'
-        50: 0,  # 'Ч'
-        54: 0,  # 'Ш'
-        57: 1,  # 'Щ'
-        61: 1,  # 'Ъ'
-        60: 0,  # 'Ю'
-        56: 0,  # 'Я'
-        1: 2,  # 'а'
-        18: 1,  # 'б'
-        9: 1,  # 'в'
-        20: 0,  # 'г'
-        11: 1,  # 'д'
-        3: 3,  # 'е'
-        23: 1,  # 'ж'
-        15: 0,  # 'з'
-        2: 2,  # 'и'
-        26: 0,  # 'й'
-        12: 1,  # 'к'
-        10: 2,  # 'л'
-        14: 1,  # 'м'
-        6: 1,  # 'н'
-        4: 2,  # 'о'
-        13: 0,  # 'п'
-        7: 2,  # 'Ñ€'
-        8: 0,  # 'Ñ'
-        5: 0,  # 'Ñ‚'
-        19: 2,  # 'у'
-        29: 0,  # 'Ñ„'
-        25: 0,  # 'Ñ…'
-        22: 0,  # 'ц'
-        21: 0,  # 'ч'
-        27: 0,  # 'ш'
-        24: 1,  # 'щ'
-        17: 2,  # 'ÑŠ'
-        52: 1,  # 'ь'
-        42: 1,  # 'ÑŽ'
-        16: 1,  # 'Ñ'
-        58: 0,  # 'Ñ”'
-        62: 0,  # 'â„–'
-    },
-    37: {  # 'Д'
-        63: 0,  # 'e'
-        45: 0,  # '\xad'
-        31: 2,  # 'Ð'
-        32: 1,  # 'Б'
-        35: 2,  # 'Ð’'
-        43: 1,  # 'Г'
-        37: 2,  # 'Д'
-        44: 2,  # 'Е'
-        55: 2,  # 'Ж'
-        47: 1,  # 'З'
-        40: 2,  # 'И'
-        59: 0,  # 'Й'
-        33: 1,  # 'К'
-        46: 1,  # 'Л'
-        38: 1,  # 'М'
-        36: 1,  # 'Ð'
-        41: 2,  # 'О'
-        30: 2,  # 'П'
-        39: 1,  # 'Р'
-        28: 2,  # 'С'
-        34: 1,  # 'Т'
-        51: 1,  # 'У'
-        48: 1,  # 'Ф'
-        49: 0,  # 'Ð¥'
-        53: 1,  # 'Ц'
-        50: 1,  # 'Ч'
-        54: 0,  # 'Ш'
-        57: 0,  # 'Щ'
-        61: 1,  # 'Ъ'
-        60: 1,  # 'Ю'
-        56: 1,  # 'Я'
-        1: 3,  # 'а'
-        18: 0,  # 'б'
-        9: 2,  # 'в'
-        20: 0,  # 'г'
-        11: 0,  # 'д'
-        3: 3,  # 'е'
-        23: 3,  # 'ж'
-        15: 1,  # 'з'
-        2: 3,  # 'и'
-        26: 0,  # 'й'
-        12: 0,  # 'к'
-        10: 1,  # 'л'
-        14: 1,  # 'м'
-        6: 2,  # 'н'
-        4: 3,  # 'о'
-        13: 0,  # 'п'
-        7: 2,  # 'Ñ€'
-        8: 0,  # 'Ñ'
-        5: 0,  # 'Ñ‚'
-        19: 2,  # 'у'
-        29: 0,  # 'Ñ„'
-        25: 0,  # 'Ñ…'
-        22: 0,  # 'ц'
-        21: 0,  # 'ч'
-        27: 0,  # 'ш'
-        24: 0,  # 'щ'
-        17: 2,  # 'ÑŠ'
-        52: 1,  # 'ь'
-        42: 2,  # 'ÑŽ'
-        16: 1,  # 'Ñ'
-        58: 0,  # 'Ñ”'
-        62: 0,  # 'â„–'
-    },
-    44: {  # 'Е'
-        63: 0,  # 'e'
-        45: 0,  # '\xad'
-        31: 1,  # 'Ð'
-        32: 1,  # 'Б'
-        35: 2,  # 'Ð’'
-        43: 1,  # 'Г'
-        37: 1,  # 'Д'
-        44: 1,  # 'Е'
-        55: 1,  # 'Ж'
-        47: 1,  # 'З'
-        40: 1,  # 'И'
-        59: 1,  # 'Й'
-        33: 2,  # 'К'
-        46: 2,  # 'Л'
-        38: 1,  # 'М'
-        36: 2,  # 'Ð'
-        41: 2,  # 'О'
-        30: 1,  # 'П'
-        39: 2,  # 'Р'
-        28: 2,  # 'С'
-        34: 2,  # 'Т'
-        51: 1,  # 'У'
-        48: 2,  # 'Ф'
-        49: 1,  # 'Ð¥'
-        53: 2,  # 'Ц'
-        50: 1,  # 'Ч'
-        54: 1,  # 'Ш'
-        57: 1,  # 'Щ'
-        61: 0,  # 'Ъ'
-        60: 0,  # 'Ю'
-        56: 1,  # 'Я'
-        1: 0,  # 'а'
-        18: 1,  # 'б'
-        9: 2,  # 'в'
-        20: 1,  # 'г'
-        11: 2,  # 'д'
-        3: 0,  # 'е'
-        23: 1,  # 'ж'
-        15: 1,  # 'з'
-        2: 0,  # 'и'
-        26: 1,  # 'й'
-        12: 2,  # 'к'
-        10: 2,  # 'л'
-        14: 2,  # 'м'
-        6: 2,  # 'н'
-        4: 0,  # 'о'
-        13: 1,  # 'п'
-        7: 2,  # 'Ñ€'
-        8: 2,  # 'Ñ'
-        5: 1,  # 'Ñ‚'
-        19: 1,  # 'у'
-        29: 1,  # 'Ñ„'
-        25: 1,  # 'Ñ…'
-        22: 0,  # 'ц'
-        21: 1,  # 'ч'
-        27: 1,  # 'ш'
-        24: 1,  # 'щ'
-        17: 1,  # 'ÑŠ'
-        52: 0,  # 'ь'
-        42: 1,  # 'ÑŽ'
-        16: 1,  # 'Ñ'
-        58: 0,  # 'Ñ”'
-        62: 0,  # 'â„–'
-    },
-    55: {  # 'Ж'
-        63: 0,  # 'e'
-        45: 0,  # '\xad'
-        31: 1,  # 'Ð'
-        32: 0,  # 'Б'
-        35: 1,  # 'Ð’'
-        43: 0,  # 'Г'
-        37: 1,  # 'Д'
-        44: 1,  # 'Е'
-        55: 0,  # 'Ж'
-        47: 0,  # 'З'
-        40: 1,  # 'И'
-        59: 0,  # 'Й'
-        33: 1,  # 'К'
-        46: 0,  # 'Л'
-        38: 0,  # 'М'
-        36: 1,  # 'Ð'
-        41: 1,  # 'О'
-        30: 0,  # 'П'
-        39: 0,  # 'Р'
-        28: 0,  # 'С'
-        34: 0,  # 'Т'
-        51: 1,  # 'У'
-        48: 0,  # 'Ф'
-        49: 0,  # 'Ð¥'
-        53: 0,  # 'Ц'
-        50: 0,  # 'Ч'
-        54: 0,  # 'Ш'
-        57: 0,  # 'Щ'
-        61: 0,  # 'Ъ'
-        60: 0,  # 'Ю'
-        56: 0,  # 'Я'
-        1: 2,  # 'а'
-        18: 0,  # 'б'
-        9: 0,  # 'в'
-        20: 0,  # 'г'
-        11: 1,  # 'д'
-        3: 2,  # 'е'
-        23: 0,  # 'ж'
-        15: 0,  # 'з'
-        2: 2,  # 'и'
-        26: 0,  # 'й'
-        12: 0,  # 'к'
-        10: 0,  # 'л'
-        14: 0,  # 'м'
-        6: 0,  # 'н'
-        4: 2,  # 'о'
-        13: 1,  # 'п'
-        7: 1,  # 'Ñ€'
-        8: 0,  # 'Ñ'
-        5: 0,  # 'Ñ‚'
-        19: 1,  # 'у'
-        29: 0,  # 'Ñ„'
-        25: 0,  # 'Ñ…'
-        22: 0,  # 'ц'
-        21: 0,  # 'ч'
-        27: 0,  # 'ш'
-        24: 0,  # 'щ'
-        17: 1,  # 'ÑŠ'
-        52: 1,  # 'ь'
-        42: 1,  # 'ÑŽ'
-        16: 0,  # 'Ñ'
-        58: 0,  # 'Ñ”'
-        62: 0,  # 'â„–'
-    },
-    47: {  # 'З'
-        63: 0,  # 'e'
-        45: 0,  # '\xad'
-        31: 2,  # 'Ð'
-        32: 1,  # 'Б'
-        35: 1,  # 'Ð’'
-        43: 1,  # 'Г'
-        37: 1,  # 'Д'
-        44: 1,  # 'Е'
-        55: 0,  # 'Ж'
-        47: 1,  # 'З'
-        40: 1,  # 'И'
-        59: 0,  # 'Й'
-        33: 1,  # 'К'
-        46: 1,  # 'Л'
-        38: 1,  # 'М'
-        36: 2,  # 'Ð'
-        41: 1,  # 'О'
-        30: 1,  # 'П'
-        39: 1,  # 'Р'
-        28: 1,  # 'С'
-        34: 1,  # 'Т'
-        51: 1,  # 'У'
-        48: 0,  # 'Ф'
-        49: 1,  # 'Ð¥'
-        53: 1,  # 'Ц'
-        50: 0,  # 'Ч'
-        54: 0,  # 'Ш'
-        57: 0,  # 'Щ'
-        61: 1,  # 'Ъ'
-        60: 0,  # 'Ю'
-        56: 1,  # 'Я'
-        1: 3,  # 'а'
-        18: 1,  # 'б'
-        9: 2,  # 'в'
-        20: 1,  # 'г'
-        11: 2,  # 'д'
-        3: 2,  # 'е'
-        23: 0,  # 'ж'
-        15: 0,  # 'з'
-        2: 1,  # 'и'
-        26: 0,  # 'й'
-        12: 0,  # 'к'
-        10: 2,  # 'л'
-        14: 1,  # 'м'
-        6: 1,  # 'н'
-        4: 1,  # 'о'
-        13: 0,  # 'п'
-        7: 1,  # 'Ñ€'
-        8: 0,  # 'Ñ'
-        5: 0,  # 'Ñ‚'
-        19: 1,  # 'у'
-        29: 0,  # 'Ñ„'
-        25: 0,  # 'Ñ…'
-        22: 0,  # 'ц'
-        21: 0,  # 'ч'
-        27: 0,  # 'ш'
-        24: 0,  # 'щ'
-        17: 1,  # 'ÑŠ'
-        52: 0,  # 'ь'
-        42: 1,  # 'ÑŽ'
-        16: 0,  # 'Ñ'
-        58: 0,  # 'Ñ”'
-        62: 0,  # 'â„–'
-    },
-    40: {  # 'И'
-        63: 0,  # 'e'
-        45: 1,  # '\xad'
-        31: 1,  # 'Ð'
-        32: 1,  # 'Б'
-        35: 1,  # 'Ð’'
-        43: 1,  # 'Г'
-        37: 1,  # 'Д'
-        44: 2,  # 'Е'
-        55: 1,  # 'Ж'
-        47: 2,  # 'З'
-        40: 1,  # 'И'
-        59: 1,  # 'Й'
-        33: 2,  # 'К'
-        46: 2,  # 'Л'
-        38: 2,  # 'М'
-        36: 2,  # 'Ð'
-        41: 1,  # 'О'
-        30: 1,  # 'П'
-        39: 2,  # 'Р'
-        28: 2,  # 'С'
-        34: 2,  # 'Т'
-        51: 0,  # 'У'
-        48: 1,  # 'Ф'
-        49: 1,  # 'Ð¥'
-        53: 1,  # 'Ц'
-        50: 1,  # 'Ч'
-        54: 1,  # 'Ш'
-        57: 1,  # 'Щ'
-        61: 0,  # 'Ъ'
-        60: 0,  # 'Ю'
-        56: 2,  # 'Я'
-        1: 1,  # 'а'
-        18: 1,  # 'б'
-        9: 3,  # 'в'
-        20: 2,  # 'г'
-        11: 1,  # 'д'
-        3: 1,  # 'е'
-        23: 0,  # 'ж'
-        15: 3,  # 'з'
-        2: 0,  # 'и'
-        26: 1,  # 'й'
-        12: 1,  # 'к'
-        10: 2,  # 'л'
-        14: 2,  # 'м'
-        6: 2,  # 'н'
-        4: 0,  # 'о'
-        13: 1,  # 'п'
-        7: 2,  # 'Ñ€'
-        8: 2,  # 'Ñ'
-        5: 2,  # 'Ñ‚'
-        19: 0,  # 'у'
-        29: 1,  # 'Ñ„'
-        25: 1,  # 'Ñ…'
-        22: 1,  # 'ц'
-        21: 1,  # 'ч'
-        27: 1,  # 'ш'
-        24: 1,  # 'щ'
-        17: 0,  # 'ÑŠ'
-        52: 0,  # 'ь'
-        42: 0,  # 'ÑŽ'
-        16: 0,  # 'Ñ'
-        58: 0,  # 'Ñ”'
-        62: 0,  # 'â„–'
-    },
-    59: {  # 'Й'
-        63: 0,  # 'e'
-        45: 0,  # '\xad'
-        31: 0,  # 'Ð'
-        32: 0,  # 'Б'
-        35: 0,  # 'Ð’'
-        43: 0,  # 'Г'
-        37: 1,  # 'Д'
-        44: 1,  # 'Е'
-        55: 0,  # 'Ж'
-        47: 0,  # 'З'
-        40: 0,  # 'И'
-        59: 0,  # 'Й'
-        33: 1,  # 'К'
-        46: 1,  # 'Л'
-        38: 1,  # 'М'
-        36: 1,  # 'Ð'
-        41: 1,  # 'О'
-        30: 0,  # 'П'
-        39: 0,  # 'Р'
-        28: 1,  # 'С'
-        34: 1,  # 'Т'
-        51: 0,  # 'У'
-        48: 0,  # 'Ф'
-        49: 0,  # 'Ð¥'
-        53: 0,  # 'Ц'
-        50: 1,  # 'Ч'
-        54: 0,  # 'Ш'
-        57: 0,  # 'Щ'
-        61: 0,  # 'Ъ'
-        60: 0,  # 'Ю'
-        56: 1,  # 'Я'
-        1: 0,  # 'а'
-        18: 0,  # 'б'
-        9: 0,  # 'в'
-        20: 0,  # 'г'
-        11: 0,  # 'д'
-        3: 1,  # 'е'
-        23: 0,  # 'ж'
-        15: 0,  # 'з'
-        2: 0,  # 'и'
-        26: 0,  # 'й'
-        12: 0,  # 'к'
-        10: 0,  # 'л'
-        14: 0,  # 'м'
-        6: 0,  # 'н'
-        4: 2,  # 'о'
-        13: 0,  # 'п'
-        7: 0,  # 'Ñ€'
-        8: 0,  # 'Ñ'
-        5: 0,  # 'Ñ‚'
-        19: 0,  # 'у'
-        29: 0,  # 'Ñ„'
-        25: 0,  # 'Ñ…'
-        22: 0,  # 'ц'
-        21: 0,  # 'ч'
-        27: 0,  # 'ш'
-        24: 0,  # 'щ'
-        17: 1,  # 'ÑŠ'
-        52: 0,  # 'ь'
-        42: 0,  # 'ÑŽ'
-        16: 0,  # 'Ñ'
-        58: 0,  # 'Ñ”'
-        62: 0,  # 'â„–'
-    },
-    33: {  # 'К'
-        63: 0,  # 'e'
-        45: 1,  # '\xad'
-        31: 2,  # 'Ð'
-        32: 1,  # 'Б'
-        35: 1,  # 'Ð’'
-        43: 1,  # 'Г'
-        37: 1,  # 'Д'
-        44: 1,  # 'Е'
-        55: 0,  # 'Ж'
-        47: 1,  # 'З'
-        40: 2,  # 'И'
-        59: 0,  # 'Й'
-        33: 1,  # 'К'
-        46: 1,  # 'Л'
-        38: 0,  # 'М'
-        36: 2,  # 'Ð'
-        41: 2,  # 'О'
-        30: 2,  # 'П'
-        39: 1,  # 'Р'
-        28: 2,  # 'С'
-        34: 1,  # 'Т'
-        51: 1,  # 'У'
-        48: 1,  # 'Ф'
-        49: 1,  # 'Ð¥'
-        53: 1,  # 'Ц'
-        50: 0,  # 'Ч'
-        54: 0,  # 'Ш'
-        57: 0,  # 'Щ'
-        61: 1,  # 'Ъ'
-        60: 1,  # 'Ю'
-        56: 0,  # 'Я'
-        1: 3,  # 'а'
-        18: 0,  # 'б'
-        9: 1,  # 'в'
-        20: 0,  # 'г'
-        11: 0,  # 'д'
-        3: 2,  # 'е'
-        23: 1,  # 'ж'
-        15: 0,  # 'з'
-        2: 2,  # 'и'
-        26: 0,  # 'й'
-        12: 0,  # 'к'
-        10: 2,  # 'л'
-        14: 1,  # 'м'
-        6: 2,  # 'н'
-        4: 3,  # 'о'
-        13: 0,  # 'п'
-        7: 3,  # 'Ñ€'
-        8: 1,  # 'Ñ'
-        5: 0,  # 'Ñ‚'
-        19: 2,  # 'у'
-        29: 0,  # 'Ñ„'
-        25: 1,  # 'Ñ…'
-        22: 0,  # 'ц'
-        21: 0,  # 'ч'
-        27: 1,  # 'ш'
-        24: 0,  # 'щ'
-        17: 2,  # 'ÑŠ'
-        52: 1,  # 'ь'
-        42: 2,  # 'ÑŽ'
-        16: 0,  # 'Ñ'
-        58: 0,  # 'Ñ”'
-        62: 0,  # 'â„–'
-    },
-    46: {  # 'Л'
-        63: 1,  # 'e'
-        45: 0,  # '\xad'
-        31: 2,  # 'Ð'
-        32: 1,  # 'Б'
-        35: 1,  # 'Ð’'
-        43: 2,  # 'Г'
-        37: 1,  # 'Д'
-        44: 2,  # 'Е'
-        55: 0,  # 'Ж'
-        47: 1,  # 'З'
-        40: 2,  # 'И'
-        59: 0,  # 'Й'
-        33: 1,  # 'К'
-        46: 1,  # 'Л'
-        38: 0,  # 'М'
-        36: 1,  # 'Ð'
-        41: 2,  # 'О'
-        30: 1,  # 'П'
-        39: 0,  # 'Р'
-        28: 1,  # 'С'
-        34: 1,  # 'Т'
-        51: 1,  # 'У'
-        48: 0,  # 'Ф'
-        49: 1,  # 'Ð¥'
-        53: 1,  # 'Ц'
-        50: 1,  # 'Ч'
-        54: 0,  # 'Ш'
-        57: 0,  # 'Щ'
-        61: 1,  # 'Ъ'
-        60: 1,  # 'Ю'
-        56: 1,  # 'Я'
-        1: 2,  # 'а'
-        18: 0,  # 'б'
-        9: 1,  # 'в'
-        20: 0,  # 'г'
-        11: 0,  # 'д'
-        3: 3,  # 'е'
-        23: 0,  # 'ж'
-        15: 0,  # 'з'
-        2: 2,  # 'и'
-        26: 0,  # 'й'
-        12: 0,  # 'к'
-        10: 0,  # 'л'
-        14: 0,  # 'м'
-        6: 0,  # 'н'
-        4: 2,  # 'о'
-        13: 0,  # 'п'
-        7: 0,  # 'Ñ€'
-        8: 0,  # 'Ñ'
-        5: 0,  # 'Ñ‚'
-        19: 2,  # 'у'
-        29: 0,  # 'Ñ„'
-        25: 0,  # 'Ñ…'
-        22: 0,  # 'ц'
-        21: 0,  # 'ч'
-        27: 0,  # 'ш'
-        24: 0,  # 'щ'
-        17: 1,  # 'ÑŠ'
-        52: 1,  # 'ь'
-        42: 2,  # 'ÑŽ'
-        16: 1,  # 'Ñ'
-        58: 0,  # 'Ñ”'
-        62: 0,  # 'â„–'
-    },
-    38: {  # 'М'
-        63: 0,  # 'e'
-        45: 0,  # '\xad'
-        31: 2,  # 'Ð'
-        32: 1,  # 'Б'
-        35: 2,  # 'Ð’'
-        43: 0,  # 'Г'
-        37: 1,  # 'Д'
-        44: 1,  # 'Е'
-        55: 0,  # 'Ж'
-        47: 1,  # 'З'
-        40: 2,  # 'И'
-        59: 0,  # 'Й'
-        33: 1,  # 'К'
-        46: 1,  # 'Л'
-        38: 1,  # 'М'
-        36: 1,  # 'Ð'
-        41: 2,  # 'О'
-        30: 1,  # 'П'
-        39: 1,  # 'Р'
-        28: 2,  # 'С'
-        34: 1,  # 'Т'
-        51: 1,  # 'У'
-        48: 1,  # 'Ф'
-        49: 0,  # 'Ð¥'
-        53: 1,  # 'Ц'
-        50: 0,  # 'Ч'
-        54: 0,  # 'Ш'
-        57: 0,  # 'Щ'
-        61: 1,  # 'Ъ'
-        60: 0,  # 'Ю'
-        56: 1,  # 'Я'
-        1: 3,  # 'а'
-        18: 0,  # 'б'
-        9: 0,  # 'в'
-        20: 0,  # 'г'
-        11: 0,  # 'д'
-        3: 3,  # 'е'
-        23: 0,  # 'ж'
-        15: 0,  # 'з'
-        2: 3,  # 'и'
-        26: 0,  # 'й'
-        12: 0,  # 'к'
-        10: 2,  # 'л'
-        14: 0,  # 'м'
-        6: 2,  # 'н'
-        4: 3,  # 'о'
-        13: 0,  # 'п'
-        7: 1,  # 'Ñ€'
-        8: 0,  # 'Ñ'
-        5: 0,  # 'Ñ‚'
-        19: 2,  # 'у'
-        29: 0,  # 'Ñ„'
-        25: 0,  # 'Ñ…'
-        22: 0,  # 'ц'
-        21: 0,  # 'ч'
-        27: 0,  # 'ш'
-        24: 0,  # 'щ'
-        17: 2,  # 'ÑŠ'
-        52: 1,  # 'ь'
-        42: 2,  # 'ÑŽ'
-        16: 1,  # 'Ñ'
-        58: 0,  # 'Ñ”'
-        62: 0,  # 'â„–'
-    },
-    36: {  # 'Ð'
-        63: 0,  # 'e'
-        45: 0,  # '\xad'
-        31: 2,  # 'Ð'
-        32: 2,  # 'Б'
-        35: 1,  # 'Ð’'
-        43: 1,  # 'Г'
-        37: 2,  # 'Д'
-        44: 2,  # 'Е'
-        55: 1,  # 'Ж'
-        47: 1,  # 'З'
-        40: 2,  # 'И'
-        59: 1,  # 'Й'
-        33: 2,  # 'К'
-        46: 1,  # 'Л'
-        38: 1,  # 'М'
-        36: 1,  # 'Ð'
-        41: 2,  # 'О'
-        30: 1,  # 'П'
-        39: 1,  # 'Р'
-        28: 2,  # 'С'
-        34: 2,  # 'Т'
-        51: 1,  # 'У'
-        48: 1,  # 'Ф'
-        49: 1,  # 'Ð¥'
-        53: 1,  # 'Ц'
-        50: 1,  # 'Ч'
-        54: 1,  # 'Ш'
-        57: 0,  # 'Щ'
-        61: 1,  # 'Ъ'
-        60: 1,  # 'Ю'
-        56: 1,  # 'Я'
-        1: 3,  # 'а'
-        18: 0,  # 'б'
-        9: 0,  # 'в'
-        20: 1,  # 'г'
-        11: 0,  # 'д'
-        3: 3,  # 'е'
-        23: 0,  # 'ж'
-        15: 0,  # 'з'
-        2: 3,  # 'и'
-        26: 0,  # 'й'
-        12: 0,  # 'к'
-        10: 0,  # 'л'
-        14: 0,  # 'м'
-        6: 0,  # 'н'
-        4: 3,  # 'о'
-        13: 0,  # 'п'
-        7: 0,  # 'Ñ€'
-        8: 0,  # 'Ñ'
-        5: 1,  # 'Ñ‚'
-        19: 1,  # 'у'
-        29: 0,  # 'Ñ„'
-        25: 0,  # 'Ñ…'
-        22: 0,  # 'ц'
-        21: 0,  # 'ч'
-        27: 1,  # 'ш'
-        24: 0,  # 'щ'
-        17: 0,  # 'ÑŠ'
-        52: 0,  # 'ь'
-        42: 2,  # 'ÑŽ'
-        16: 2,  # 'Ñ'
-        58: 0,  # 'Ñ”'
-        62: 0,  # 'â„–'
-    },
-    41: {  # 'О'
-        63: 0,  # 'e'
-        45: 0,  # '\xad'
-        31: 1,  # 'Ð'
-        32: 1,  # 'Б'
-        35: 2,  # 'Ð’'
-        43: 1,  # 'Г'
-        37: 2,  # 'Д'
-        44: 1,  # 'Е'
-        55: 1,  # 'Ж'
-        47: 1,  # 'З'
-        40: 1,  # 'И'
-        59: 1,  # 'Й'
-        33: 2,  # 'К'
-        46: 2,  # 'Л'
-        38: 2,  # 'М'
-        36: 2,  # 'Ð'
-        41: 2,  # 'О'
-        30: 1,  # 'П'
-        39: 2,  # 'Р'
-        28: 2,  # 'С'
-        34: 2,  # 'Т'
-        51: 1,  # 'У'
-        48: 1,  # 'Ф'
-        49: 1,  # 'Ð¥'
-        53: 0,  # 'Ц'
-        50: 1,  # 'Ч'
-        54: 1,  # 'Ш'
-        57: 1,  # 'Щ'
-        61: 0,  # 'Ъ'
-        60: 0,  # 'Ю'
-        56: 1,  # 'Я'
-        1: 1,  # 'а'
-        18: 2,  # 'б'
-        9: 2,  # 'в'
-        20: 2,  # 'г'
-        11: 1,  # 'д'
-        3: 1,  # 'е'
-        23: 1,  # 'ж'
-        15: 1,  # 'з'
-        2: 0,  # 'и'
-        26: 1,  # 'й'
-        12: 2,  # 'к'
-        10: 2,  # 'л'
-        14: 1,  # 'м'
-        6: 1,  # 'н'
-        4: 0,  # 'о'
-        13: 2,  # 'п'
-        7: 2,  # 'Ñ€'
-        8: 2,  # 'Ñ'
-        5: 3,  # 'Ñ‚'
-        19: 1,  # 'у'
-        29: 1,  # 'Ñ„'
-        25: 1,  # 'Ñ…'
-        22: 1,  # 'ц'
-        21: 2,  # 'ч'
-        27: 0,  # 'ш'
-        24: 2,  # 'щ'
-        17: 0,  # 'ÑŠ'
-        52: 0,  # 'ь'
-        42: 0,  # 'ÑŽ'
-        16: 1,  # 'Ñ'
-        58: 0,  # 'Ñ”'
-        62: 0,  # 'â„–'
-    },
-    30: {  # 'П'
-        63: 0,  # 'e'
-        45: 1,  # '\xad'
-        31: 2,  # 'Ð'
-        32: 1,  # 'Б'
-        35: 1,  # 'Ð’'
-        43: 1,  # 'Г'
-        37: 1,  # 'Д'
-        44: 1,  # 'Е'
-        55: 0,  # 'Ж'
-        47: 1,  # 'З'
-        40: 2,  # 'И'
-        59: 0,  # 'Й'
-        33: 1,  # 'К'
-        46: 1,  # 'Л'
-        38: 1,  # 'М'
-        36: 1,  # 'Ð'
-        41: 2,  # 'О'
-        30: 2,  # 'П'
-        39: 2,  # 'Р'
-        28: 2,  # 'С'
-        34: 1,  # 'Т'
-        51: 2,  # 'У'
-        48: 1,  # 'Ф'
-        49: 0,  # 'Ð¥'
-        53: 1,  # 'Ц'
-        50: 1,  # 'Ч'
-        54: 1,  # 'Ш'
-        57: 0,  # 'Щ'
-        61: 1,  # 'Ъ'
-        60: 1,  # 'Ю'
-        56: 0,  # 'Я'
-        1: 3,  # 'а'
-        18: 0,  # 'б'
-        9: 0,  # 'в'
-        20: 0,  # 'г'
-        11: 2,  # 'д'
-        3: 3,  # 'е'
-        23: 0,  # 'ж'
-        15: 0,  # 'з'
-        2: 2,  # 'и'
-        26: 0,  # 'й'
-        12: 1,  # 'к'
-        10: 3,  # 'л'
-        14: 0,  # 'м'
-        6: 1,  # 'н'
-        4: 3,  # 'о'
-        13: 0,  # 'п'
-        7: 3,  # 'Ñ€'
-        8: 1,  # 'Ñ'
-        5: 1,  # 'Ñ‚'
-        19: 2,  # 'у'
-        29: 1,  # 'Ñ„'
-        25: 1,  # 'Ñ…'
-        22: 0,  # 'ц'
-        21: 1,  # 'ч'
-        27: 1,  # 'ш'
-        24: 0,  # 'щ'
-        17: 2,  # 'ÑŠ'
-        52: 1,  # 'ь'
-        42: 1,  # 'ÑŽ'
-        16: 1,  # 'Ñ'
-        58: 0,  # 'Ñ”'
-        62: 0,  # 'â„–'
-    },
-    39: {  # 'Р'
-        63: 0,  # 'e'
-        45: 1,  # '\xad'
-        31: 2,  # 'Ð'
-        32: 1,  # 'Б'
-        35: 1,  # 'Ð’'
-        43: 2,  # 'Г'
-        37: 2,  # 'Д'
-        44: 2,  # 'Е'
-        55: 0,  # 'Ж'
-        47: 1,  # 'З'
-        40: 2,  # 'И'
-        59: 0,  # 'Й'
-        33: 1,  # 'К'
-        46: 0,  # 'Л'
-        38: 1,  # 'М'
-        36: 1,  # 'Ð'
-        41: 2,  # 'О'
-        30: 2,  # 'П'
-        39: 1,  # 'Р'
-        28: 1,  # 'С'
-        34: 1,  # 'Т'
-        51: 1,  # 'У'
-        48: 1,  # 'Ф'
-        49: 1,  # 'Ð¥'
-        53: 1,  # 'Ц'
-        50: 1,  # 'Ч'
-        54: 0,  # 'Ш'
-        57: 0,  # 'Щ'
-        61: 1,  # 'Ъ'
-        60: 1,  # 'Ю'
-        56: 1,  # 'Я'
-        1: 3,  # 'а'
-        18: 0,  # 'б'
-        9: 0,  # 'в'
-        20: 0,  # 'г'
-        11: 0,  # 'д'
-        3: 2,  # 'е'
-        23: 0,  # 'ж'
-        15: 0,  # 'з'
-        2: 2,  # 'и'
-        26: 0,  # 'й'
-        12: 0,  # 'к'
-        10: 0,  # 'л'
-        14: 0,  # 'м'
-        6: 1,  # 'н'
-        4: 3,  # 'о'
-        13: 0,  # 'п'
-        7: 0,  # 'Ñ€'
-        8: 1,  # 'Ñ'
-        5: 0,  # 'Ñ‚'
-        19: 3,  # 'у'
-        29: 0,  # 'Ñ„'
-        25: 0,  # 'Ñ…'
-        22: 0,  # 'ц'
-        21: 0,  # 'ч'
-        27: 0,  # 'ш'
-        24: 0,  # 'щ'
-        17: 1,  # 'ÑŠ'
-        52: 0,  # 'ь'
-        42: 1,  # 'ÑŽ'
-        16: 1,  # 'Ñ'
-        58: 0,  # 'Ñ”'
-        62: 0,  # 'â„–'
-    },
-    28: {  # 'С'
-        63: 1,  # 'e'
-        45: 0,  # '\xad'
-        31: 3,  # 'Ð'
-        32: 2,  # 'Б'
-        35: 2,  # 'Ð’'
-        43: 1,  # 'Г'
-        37: 2,  # 'Д'
-        44: 2,  # 'Е'
-        55: 1,  # 'Ж'
-        47: 1,  # 'З'
-        40: 2,  # 'И'
-        59: 0,  # 'Й'
-        33: 2,  # 'К'
-        46: 1,  # 'Л'
-        38: 1,  # 'М'
-        36: 1,  # 'Ð'
-        41: 2,  # 'О'
-        30: 2,  # 'П'
-        39: 1,  # 'Р'
-        28: 2,  # 'С'
-        34: 2,  # 'Т'
-        51: 1,  # 'У'
-        48: 1,  # 'Ф'
-        49: 0,  # 'Ð¥'
-        53: 0,  # 'Ц'
-        50: 0,  # 'Ч'
-        54: 0,  # 'Ш'
-        57: 0,  # 'Щ'
-        61: 1,  # 'Ъ'
-        60: 1,  # 'Ю'
-        56: 1,  # 'Я'
-        1: 3,  # 'а'
-        18: 1,  # 'б'
-        9: 2,  # 'в'
-        20: 1,  # 'г'
-        11: 1,  # 'д'
-        3: 3,  # 'е'
-        23: 0,  # 'ж'
-        15: 0,  # 'з'
-        2: 3,  # 'и'
-        26: 0,  # 'й'
-        12: 2,  # 'к'
-        10: 3,  # 'л'
-        14: 2,  # 'м'
-        6: 1,  # 'н'
-        4: 3,  # 'о'
-        13: 3,  # 'п'
-        7: 2,  # 'Ñ€'
-        8: 0,  # 'Ñ'
-        5: 3,  # 'Ñ‚'
-        19: 2,  # 'у'
-        29: 2,  # 'Ñ„'
-        25: 1,  # 'Ñ…'
-        22: 1,  # 'ц'
-        21: 1,  # 'ч'
-        27: 0,  # 'ш'
-        24: 0,  # 'щ'
-        17: 3,  # 'ÑŠ'
-        52: 1,  # 'ь'
-        42: 1,  # 'ÑŽ'
-        16: 1,  # 'Ñ'
-        58: 0,  # 'Ñ”'
-        62: 0,  # 'â„–'
-    },
-    34: {  # 'Т'
-        63: 0,  # 'e'
-        45: 0,  # '\xad'
-        31: 2,  # 'Ð'
-        32: 2,  # 'Б'
-        35: 1,  # 'Ð’'
-        43: 0,  # 'Г'
-        37: 1,  # 'Д'
-        44: 2,  # 'Е'
-        55: 0,  # 'Ж'
-        47: 0,  # 'З'
-        40: 2,  # 'И'
-        59: 0,  # 'Й'
-        33: 2,  # 'К'
-        46: 1,  # 'Л'
-        38: 1,  # 'М'
-        36: 1,  # 'Ð'
-        41: 2,  # 'О'
-        30: 1,  # 'П'
-        39: 2,  # 'Р'
-        28: 2,  # 'С'
-        34: 1,  # 'Т'
-        51: 1,  # 'У'
-        48: 1,  # 'Ф'
-        49: 0,  # 'Ð¥'
-        53: 1,  # 'Ц'
-        50: 0,  # 'Ч'
-        54: 0,  # 'Ш'
-        57: 0,  # 'Щ'
-        61: 1,  # 'Ъ'
-        60: 0,  # 'Ю'
-        56: 1,  # 'Я'
-        1: 3,  # 'а'
-        18: 1,  # 'б'
-        9: 1,  # 'в'
-        20: 0,  # 'г'
-        11: 0,  # 'д'
-        3: 3,  # 'е'
-        23: 0,  # 'ж'
-        15: 0,  # 'з'
-        2: 2,  # 'и'
-        26: 0,  # 'й'
-        12: 1,  # 'к'
-        10: 1,  # 'л'
-        14: 0,  # 'м'
-        6: 0,  # 'н'
-        4: 3,  # 'о'
-        13: 0,  # 'п'
-        7: 3,  # 'Ñ€'
-        8: 0,  # 'Ñ'
-        5: 0,  # 'Ñ‚'
-        19: 2,  # 'у'
-        29: 0,  # 'Ñ„'
-        25: 0,  # 'Ñ…'
-        22: 0,  # 'ц'
-        21: 0,  # 'ч'
-        27: 0,  # 'ш'
-        24: 0,  # 'щ'
-        17: 2,  # 'ÑŠ'
-        52: 0,  # 'ь'
-        42: 1,  # 'ÑŽ'
-        16: 2,  # 'Ñ'
-        58: 0,  # 'Ñ”'
-        62: 0,  # 'â„–'
-    },
-    51: {  # 'У'
-        63: 0,  # 'e'
-        45: 1,  # '\xad'
-        31: 1,  # 'Ð'
-        32: 1,  # 'Б'
-        35: 1,  # 'Ð’'
-        43: 1,  # 'Г'
-        37: 1,  # 'Д'
-        44: 2,  # 'Е'
-        55: 1,  # 'Ж'
-        47: 1,  # 'З'
-        40: 1,  # 'И'
-        59: 0,  # 'Й'
-        33: 1,  # 'К'
-        46: 1,  # 'Л'
-        38: 1,  # 'М'
-        36: 1,  # 'Ð'
-        41: 0,  # 'О'
-        30: 1,  # 'П'
-        39: 1,  # 'Р'
-        28: 1,  # 'С'
-        34: 2,  # 'Т'
-        51: 0,  # 'У'
-        48: 1,  # 'Ф'
-        49: 1,  # 'Ð¥'
-        53: 1,  # 'Ц'
-        50: 1,  # 'Ч'
-        54: 1,  # 'Ш'
-        57: 0,  # 'Щ'
-        61: 0,  # 'Ъ'
-        60: 0,  # 'Ю'
-        56: 0,  # 'Я'
-        1: 1,  # 'а'
-        18: 1,  # 'б'
-        9: 2,  # 'в'
-        20: 1,  # 'г'
-        11: 1,  # 'д'
-        3: 2,  # 'е'
-        23: 1,  # 'ж'
-        15: 1,  # 'з'
-        2: 2,  # 'и'
-        26: 1,  # 'й'
-        12: 2,  # 'к'
-        10: 1,  # 'л'
-        14: 1,  # 'м'
-        6: 2,  # 'н'
-        4: 2,  # 'о'
-        13: 1,  # 'п'
-        7: 1,  # 'Ñ€'
-        8: 2,  # 'Ñ'
-        5: 1,  # 'Ñ‚'
-        19: 1,  # 'у'
-        29: 0,  # 'Ñ„'
-        25: 1,  # 'Ñ…'
-        22: 0,  # 'ц'
-        21: 2,  # 'ч'
-        27: 1,  # 'ш'
-        24: 0,  # 'щ'
-        17: 1,  # 'ÑŠ'
-        52: 0,  # 'ь'
-        42: 0,  # 'ÑŽ'
-        16: 0,  # 'Ñ'
-        58: 0,  # 'Ñ”'
-        62: 0,  # 'â„–'
-    },
-    48: {  # 'Ф'
-        63: 0,  # 'e'
-        45: 0,  # '\xad'
-        31: 2,  # 'Ð'
-        32: 1,  # 'Б'
-        35: 1,  # 'Ð’'
-        43: 0,  # 'Г'
-        37: 0,  # 'Д'
-        44: 1,  # 'Е'
-        55: 0,  # 'Ж'
-        47: 0,  # 'З'
-        40: 2,  # 'И'
-        59: 0,  # 'Й'
-        33: 1,  # 'К'
-        46: 1,  # 'Л'
-        38: 0,  # 'М'
-        36: 1,  # 'Ð'
-        41: 1,  # 'О'
-        30: 2,  # 'П'
-        39: 1,  # 'Р'
-        28: 2,  # 'С'
-        34: 1,  # 'Т'
-        51: 1,  # 'У'
-        48: 0,  # 'Ф'
-        49: 0,  # 'Ð¥'
-        53: 0,  # 'Ц'
-        50: 0,  # 'Ч'
-        54: 0,  # 'Ш'
-        57: 0,  # 'Щ'
-        61: 0,  # 'Ъ'
-        60: 0,  # 'Ю'
-        56: 0,  # 'Я'
-        1: 2,  # 'а'
-        18: 0,  # 'б'
-        9: 0,  # 'в'
-        20: 0,  # 'г'
-        11: 0,  # 'д'
-        3: 2,  # 'е'
-        23: 0,  # 'ж'
-        15: 0,  # 'з'
-        2: 2,  # 'и'
-        26: 0,  # 'й'
-        12: 0,  # 'к'
-        10: 2,  # 'л'
-        14: 0,  # 'м'
-        6: 0,  # 'н'
-        4: 2,  # 'о'
-        13: 0,  # 'п'
-        7: 2,  # 'Ñ€'
-        8: 0,  # 'Ñ'
-        5: 0,  # 'Ñ‚'
-        19: 1,  # 'у'
-        29: 0,  # 'Ñ„'
-        25: 0,  # 'Ñ…'
-        22: 0,  # 'ц'
-        21: 0,  # 'ч'
-        27: 0,  # 'ш'
-        24: 0,  # 'щ'
-        17: 1,  # 'ÑŠ'
-        52: 1,  # 'ь'
-        42: 1,  # 'ÑŽ'
-        16: 0,  # 'Ñ'
-        58: 0,  # 'Ñ”'
-        62: 0,  # 'â„–'
-    },
-    49: {  # 'Ð¥'
-        63: 0,  # 'e'
-        45: 0,  # '\xad'
-        31: 1,  # 'Ð'
-        32: 0,  # 'Б'
-        35: 1,  # 'Ð’'
-        43: 1,  # 'Г'
-        37: 1,  # 'Д'
-        44: 1,  # 'Е'
-        55: 0,  # 'Ж'
-        47: 0,  # 'З'
-        40: 1,  # 'И'
-        59: 0,  # 'Й'
-        33: 0,  # 'К'
-        46: 1,  # 'Л'
-        38: 1,  # 'М'
-        36: 1,  # 'Ð'
-        41: 1,  # 'О'
-        30: 1,  # 'П'
-        39: 1,  # 'Р'
-        28: 0,  # 'С'
-        34: 0,  # 'Т'
-        51: 0,  # 'У'
-        48: 0,  # 'Ф'
-        49: 1,  # 'Ð¥'
-        53: 0,  # 'Ц'
-        50: 0,  # 'Ч'
-        54: 0,  # 'Ш'
-        57: 0,  # 'Щ'
-        61: 0,  # 'Ъ'
-        60: 0,  # 'Ю'
-        56: 0,  # 'Я'
-        1: 2,  # 'а'
-        18: 0,  # 'б'
-        9: 1,  # 'в'
-        20: 0,  # 'г'
-        11: 0,  # 'д'
-        3: 2,  # 'е'
-        23: 0,  # 'ж'
-        15: 0,  # 'з'
-        2: 2,  # 'и'
-        26: 0,  # 'й'
-        12: 0,  # 'к'
-        10: 1,  # 'л'
-        14: 1,  # 'м'
-        6: 0,  # 'н'
-        4: 2,  # 'о'
-        13: 0,  # 'п'
-        7: 2,  # 'Ñ€'
-        8: 0,  # 'Ñ'
-        5: 0,  # 'Ñ‚'
-        19: 2,  # 'у'
-        29: 0,  # 'Ñ„'
-        25: 0,  # 'Ñ…'
-        22: 0,  # 'ц'
-        21: 0,  # 'ч'
-        27: 0,  # 'ш'
-        24: 0,  # 'щ'
-        17: 2,  # 'ÑŠ'
-        52: 1,  # 'ь'
-        42: 1,  # 'ÑŽ'
-        16: 0,  # 'Ñ'
-        58: 0,  # 'Ñ”'
-        62: 0,  # 'â„–'
-    },
-    53: {  # 'Ц'
-        63: 0,  # 'e'
-        45: 0,  # '\xad'
-        31: 1,  # 'Ð'
-        32: 0,  # 'Б'
-        35: 1,  # 'Ð’'
-        43: 0,  # 'Г'
-        37: 0,  # 'Д'
-        44: 1,  # 'Е'
-        55: 0,  # 'Ж'
-        47: 0,  # 'З'
-        40: 2,  # 'И'
-        59: 0,  # 'Й'
-        33: 2,  # 'К'
-        46: 1,  # 'Л'
-        38: 1,  # 'М'
-        36: 0,  # 'Ð'
-        41: 0,  # 'О'
-        30: 0,  # 'П'
-        39: 1,  # 'Р'
-        28: 2,  # 'С'
-        34: 0,  # 'Т'
-        51: 1,  # 'У'
-        48: 0,  # 'Ф'
-        49: 0,  # 'Ð¥'
-        53: 0,  # 'Ц'
-        50: 0,  # 'Ч'
-        54: 0,  # 'Ш'
-        57: 0,  # 'Щ'
-        61: 0,  # 'Ъ'
-        60: 0,  # 'Ю'
-        56: 0,  # 'Я'
-        1: 2,  # 'а'
-        18: 0,  # 'б'
-        9: 2,  # 'в'
-        20: 0,  # 'г'
-        11: 0,  # 'д'
-        3: 2,  # 'е'
-        23: 0,  # 'ж'
-        15: 1,  # 'з'
-        2: 2,  # 'и'
-        26: 0,  # 'й'
-        12: 0,  # 'к'
-        10: 0,  # 'л'
-        14: 0,  # 'м'
-        6: 0,  # 'н'
-        4: 1,  # 'о'
-        13: 0,  # 'п'
-        7: 1,  # 'Ñ€'
-        8: 0,  # 'Ñ'
-        5: 0,  # 'Ñ‚'
-        19: 1,  # 'у'
-        29: 0,  # 'Ñ„'
-        25: 0,  # 'Ñ…'
-        22: 0,  # 'ц'
-        21: 0,  # 'ч'
-        27: 0,  # 'ш'
-        24: 0,  # 'щ'
-        17: 1,  # 'ÑŠ'
-        52: 0,  # 'ь'
-        42: 1,  # 'ÑŽ'
-        16: 1,  # 'Ñ'
-        58: 0,  # 'Ñ”'
-        62: 0,  # 'â„–'
-    },
-    50: {  # 'Ч'
-        63: 0,  # 'e'
-        45: 0,  # '\xad'
-        31: 2,  # 'Ð'
-        32: 1,  # 'Б'
-        35: 0,  # 'Ð’'
-        43: 0,  # 'Г'
-        37: 0,  # 'Д'
-        44: 1,  # 'Е'
-        55: 0,  # 'Ж'
-        47: 1,  # 'З'
-        40: 1,  # 'И'
-        59: 0,  # 'Й'
-        33: 1,  # 'К'
-        46: 1,  # 'Л'
-        38: 0,  # 'М'
-        36: 1,  # 'Ð'
-        41: 1,  # 'О'
-        30: 0,  # 'П'
-        39: 0,  # 'Р'
-        28: 0,  # 'С'
-        34: 0,  # 'Т'
-        51: 1,  # 'У'
-        48: 0,  # 'Ф'
-        49: 0,  # 'Ð¥'
-        53: 0,  # 'Ц'
-        50: 0,  # 'Ч'
-        54: 0,  # 'Ш'
-        57: 0,  # 'Щ'
-        61: 0,  # 'Ъ'
-        60: 0,  # 'Ю'
-        56: 0,  # 'Я'
-        1: 2,  # 'а'
-        18: 0,  # 'б'
-        9: 0,  # 'в'
-        20: 0,  # 'г'
-        11: 0,  # 'д'
-        3: 3,  # 'е'
-        23: 1,  # 'ж'
-        15: 0,  # 'з'
-        2: 2,  # 'и'
-        26: 0,  # 'й'
-        12: 0,  # 'к'
-        10: 1,  # 'л'
-        14: 0,  # 'м'
-        6: 0,  # 'н'
-        4: 2,  # 'о'
-        13: 0,  # 'п'
-        7: 1,  # 'Ñ€'
-        8: 0,  # 'Ñ'
-        5: 0,  # 'Ñ‚'
-        19: 2,  # 'у'
-        29: 0,  # 'Ñ„'
-        25: 0,  # 'Ñ…'
-        22: 0,  # 'ц'
-        21: 0,  # 'ч'
-        27: 0,  # 'ш'
-        24: 0,  # 'щ'
-        17: 1,  # 'ÑŠ'
-        52: 1,  # 'ь'
-        42: 0,  # 'ÑŽ'
-        16: 0,  # 'Ñ'
-        58: 0,  # 'Ñ”'
-        62: 0,  # 'â„–'
-    },
-    54: {  # 'Ш'
-        63: 0,  # 'e'
-        45: 0,  # '\xad'
-        31: 1,  # 'Ð'
-        32: 0,  # 'Б'
-        35: 0,  # 'Ð’'
-        43: 0,  # 'Г'
-        37: 0,  # 'Д'
-        44: 1,  # 'Е'
-        55: 0,  # 'Ж'
-        47: 1,  # 'З'
-        40: 1,  # 'И'
-        59: 0,  # 'Й'
-        33: 1,  # 'К'
-        46: 0,  # 'Л'
-        38: 0,  # 'М'
-        36: 1,  # 'Ð'
-        41: 1,  # 'О'
-        30: 0,  # 'П'
-        39: 0,  # 'Р'
-        28: 0,  # 'С'
-        34: 0,  # 'Т'
-        51: 1,  # 'У'
-        48: 0,  # 'Ф'
-        49: 0,  # 'Ð¥'
-        53: 0,  # 'Ц'
-        50: 0,  # 'Ч'
-        54: 0,  # 'Ш'
-        57: 0,  # 'Щ'
-        61: 0,  # 'Ъ'
-        60: 0,  # 'Ю'
-        56: 0,  # 'Я'
-        1: 2,  # 'а'
-        18: 0,  # 'б'
-        9: 2,  # 'в'
-        20: 0,  # 'г'
-        11: 0,  # 'д'
-        3: 2,  # 'е'
-        23: 0,  # 'ж'
-        15: 0,  # 'з'
-        2: 2,  # 'и'
-        26: 0,  # 'й'
-        12: 1,  # 'к'
-        10: 1,  # 'л'
-        14: 1,  # 'м'
-        6: 1,  # 'н'
-        4: 2,  # 'о'
-        13: 1,  # 'п'
-        7: 1,  # 'Ñ€'
-        8: 0,  # 'Ñ'
-        5: 0,  # 'Ñ‚'
-        19: 2,  # 'у'
-        29: 0,  # 'Ñ„'
-        25: 0,  # 'Ñ…'
-        22: 0,  # 'ц'
-        21: 1,  # 'ч'
-        27: 0,  # 'ш'
-        24: 0,  # 'щ'
-        17: 1,  # 'ÑŠ'
-        52: 1,  # 'ь'
-        42: 0,  # 'ÑŽ'
-        16: 0,  # 'Ñ'
-        58: 0,  # 'Ñ”'
-        62: 0,  # 'â„–'
-    },
-    57: {  # 'Щ'
-        63: 0,  # 'e'
-        45: 0,  # '\xad'
-        31: 1,  # 'Ð'
-        32: 0,  # 'Б'
-        35: 0,  # 'Ð’'
-        43: 0,  # 'Г'
-        37: 0,  # 'Д'
-        44: 1,  # 'Е'
-        55: 0,  # 'Ж'
-        47: 0,  # 'З'
-        40: 1,  # 'И'
-        59: 0,  # 'Й'
-        33: 0,  # 'К'
-        46: 0,  # 'Л'
-        38: 0,  # 'М'
-        36: 0,  # 'Ð'
-        41: 1,  # 'О'
-        30: 0,  # 'П'
-        39: 0,  # 'Р'
-        28: 0,  # 'С'
-        34: 0,  # 'Т'
-        51: 0,  # 'У'
-        48: 0,  # 'Ф'
-        49: 0,  # 'Ð¥'
-        53: 0,  # 'Ц'
-        50: 0,  # 'Ч'
-        54: 0,  # 'Ш'
-        57: 0,  # 'Щ'
-        61: 0,  # 'Ъ'
-        60: 0,  # 'Ю'
-        56: 0,  # 'Я'
-        1: 2,  # 'а'
-        18: 0,  # 'б'
-        9: 0,  # 'в'
-        20: 0,  # 'г'
-        11: 0,  # 'д'
-        3: 2,  # 'е'
-        23: 0,  # 'ж'
-        15: 0,  # 'з'
-        2: 1,  # 'и'
-        26: 0,  # 'й'
-        12: 0,  # 'к'
-        10: 0,  # 'л'
-        14: 0,  # 'м'
-        6: 0,  # 'н'
-        4: 1,  # 'о'
-        13: 0,  # 'п'
-        7: 1,  # 'Ñ€'
-        8: 0,  # 'Ñ'
-        5: 0,  # 'Ñ‚'
-        19: 1,  # 'у'
-        29: 0,  # 'Ñ„'
-        25: 0,  # 'Ñ…'
-        22: 0,  # 'ц'
-        21: 0,  # 'ч'
-        27: 0,  # 'ш'
-        24: 0,  # 'щ'
-        17: 1,  # 'ÑŠ'
-        52: 0,  # 'ь'
-        42: 0,  # 'ÑŽ'
-        16: 1,  # 'Ñ'
-        58: 0,  # 'Ñ”'
-        62: 0,  # 'â„–'
-    },
-    61: {  # 'Ъ'
-        63: 0,  # 'e'
-        45: 0,  # '\xad'
-        31: 0,  # 'Ð'
-        32: 1,  # 'Б'
-        35: 1,  # 'Ð’'
-        43: 0,  # 'Г'
-        37: 1,  # 'Д'
-        44: 0,  # 'Е'
-        55: 1,  # 'Ж'
-        47: 1,  # 'З'
-        40: 0,  # 'И'
-        59: 0,  # 'Й'
-        33: 1,  # 'К'
-        46: 2,  # 'Л'
-        38: 1,  # 'М'
-        36: 1,  # 'Ð'
-        41: 0,  # 'О'
-        30: 1,  # 'П'
-        39: 2,  # 'Р'
-        28: 1,  # 'С'
-        34: 1,  # 'Т'
-        51: 0,  # 'У'
-        48: 0,  # 'Ф'
-        49: 1,  # 'Ð¥'
-        53: 1,  # 'Ц'
-        50: 1,  # 'Ч'
-        54: 1,  # 'Ш'
-        57: 1,  # 'Щ'
-        61: 0,  # 'Ъ'
-        60: 0,  # 'Ю'
-        56: 0,  # 'Я'
-        1: 0,  # 'а'
-        18: 0,  # 'б'
-        9: 0,  # 'в'
-        20: 0,  # 'г'
-        11: 0,  # 'д'
-        3: 0,  # 'е'
-        23: 0,  # 'ж'
-        15: 0,  # 'з'
-        2: 0,  # 'и'
-        26: 0,  # 'й'
-        12: 0,  # 'к'
-        10: 1,  # 'л'
-        14: 0,  # 'м'
-        6: 1,  # 'н'
-        4: 0,  # 'о'
-        13: 0,  # 'п'
-        7: 1,  # 'Ñ€'
-        8: 0,  # 'Ñ'
-        5: 0,  # 'Ñ‚'
-        19: 0,  # 'у'
-        29: 0,  # 'Ñ„'
-        25: 0,  # 'Ñ…'
-        22: 0,  # 'ц'
-        21: 0,  # 'ч'
-        27: 0,  # 'ш'
-        24: 0,  # 'щ'
-        17: 0,  # 'ÑŠ'
-        52: 0,  # 'ь'
-        42: 0,  # 'ÑŽ'
-        16: 0,  # 'Ñ'
-        58: 0,  # 'Ñ”'
-        62: 0,  # 'â„–'
-    },
-    60: {  # 'Ю'
-        63: 0,  # 'e'
-        45: 0,  # '\xad'
-        31: 1,  # 'Ð'
-        32: 1,  # 'Б'
-        35: 0,  # 'Ð’'
-        43: 1,  # 'Г'
-        37: 1,  # 'Д'
-        44: 0,  # 'Е'
-        55: 1,  # 'Ж'
-        47: 0,  # 'З'
-        40: 0,  # 'И'
-        59: 0,  # 'Й'
-        33: 1,  # 'К'
-        46: 1,  # 'Л'
-        38: 0,  # 'М'
-        36: 1,  # 'Ð'
-        41: 0,  # 'О'
-        30: 0,  # 'П'
-        39: 1,  # 'Р'
-        28: 1,  # 'С'
-        34: 0,  # 'Т'
-        51: 0,  # 'У'
-        48: 0,  # 'Ф'
-        49: 0,  # 'Ð¥'
-        53: 0,  # 'Ц'
-        50: 0,  # 'Ч'
-        54: 0,  # 'Ш'
-        57: 0,  # 'Щ'
-        61: 0,  # 'Ъ'
-        60: 0,  # 'Ю'
-        56: 0,  # 'Я'
-        1: 0,  # 'а'
-        18: 1,  # 'б'
-        9: 1,  # 'в'
-        20: 2,  # 'г'
-        11: 1,  # 'д'
-        3: 0,  # 'е'
-        23: 2,  # 'ж'
-        15: 1,  # 'з'
-        2: 1,  # 'и'
-        26: 0,  # 'й'
-        12: 1,  # 'к'
-        10: 1,  # 'л'
-        14: 1,  # 'м'
-        6: 1,  # 'н'
-        4: 0,  # 'о'
-        13: 1,  # 'п'
-        7: 1,  # 'Ñ€'
-        8: 1,  # 'Ñ'
-        5: 1,  # 'Ñ‚'
-        19: 0,  # 'у'
-        29: 0,  # 'Ñ„'
-        25: 1,  # 'Ñ…'
-        22: 0,  # 'ц'
-        21: 0,  # 'ч'
-        27: 0,  # 'ш'
-        24: 0,  # 'щ'
-        17: 0,  # 'ÑŠ'
-        52: 0,  # 'ь'
-        42: 0,  # 'ÑŽ'
-        16: 0,  # 'Ñ'
-        58: 0,  # 'Ñ”'
-        62: 0,  # 'â„–'
-    },
-    56: {  # 'Я'
-        63: 0,  # 'e'
-        45: 0,  # '\xad'
-        31: 0,  # 'Ð'
-        32: 1,  # 'Б'
-        35: 1,  # 'Ð’'
-        43: 1,  # 'Г'
-        37: 1,  # 'Д'
-        44: 0,  # 'Е'
-        55: 0,  # 'Ж'
-        47: 0,  # 'З'
-        40: 0,  # 'И'
-        59: 0,  # 'Й'
-        33: 1,  # 'К'
-        46: 1,  # 'Л'
-        38: 1,  # 'М'
-        36: 1,  # 'Ð'
-        41: 0,  # 'О'
-        30: 0,  # 'П'
-        39: 0,  # 'Р'
-        28: 1,  # 'С'
-        34: 2,  # 'Т'
-        51: 0,  # 'У'
-        48: 0,  # 'Ф'
-        49: 0,  # 'Ð¥'
-        53: 0,  # 'Ц'
-        50: 0,  # 'Ч'
-        54: 0,  # 'Ш'
-        57: 0,  # 'Щ'
-        61: 0,  # 'Ъ'
-        60: 0,  # 'Ю'
-        56: 0,  # 'Я'
-        1: 0,  # 'а'
-        18: 1,  # 'б'
-        9: 1,  # 'в'
-        20: 1,  # 'г'
-        11: 1,  # 'д'
-        3: 0,  # 'е'
-        23: 0,  # 'ж'
-        15: 1,  # 'з'
-        2: 1,  # 'и'
-        26: 1,  # 'й'
-        12: 1,  # 'к'
-        10: 1,  # 'л'
-        14: 2,  # 'м'
-        6: 2,  # 'н'
-        4: 0,  # 'о'
-        13: 2,  # 'п'
-        7: 1,  # 'Ñ€'
-        8: 1,  # 'Ñ'
-        5: 1,  # 'Ñ‚'
-        19: 0,  # 'у'
-        29: 0,  # 'Ñ„'
-        25: 1,  # 'Ñ…'
-        22: 0,  # 'ц'
-        21: 0,  # 'ч'
-        27: 1,  # 'ш'
-        24: 0,  # 'щ'
-        17: 0,  # 'ÑŠ'
-        52: 0,  # 'ь'
-        42: 1,  # 'ÑŽ'
-        16: 0,  # 'Ñ'
-        58: 0,  # 'Ñ”'
-        62: 0,  # 'â„–'
-    },
-    1: {  # 'а'
-        63: 1,  # 'e'
-        45: 1,  # '\xad'
-        31: 1,  # 'Ð'
-        32: 0,  # 'Б'
-        35: 0,  # 'Ð’'
-        43: 0,  # 'Г'
-        37: 0,  # 'Д'
-        44: 1,  # 'Е'
-        55: 0,  # 'Ж'
-        47: 0,  # 'З'
-        40: 0,  # 'И'
-        59: 0,  # 'Й'
-        33: 0,  # 'К'
-        46: 0,  # 'Л'
-        38: 0,  # 'М'
-        36: 0,  # 'Ð'
-        41: 0,  # 'О'
-        30: 0,  # 'П'
-        39: 0,  # 'Р'
-        28: 0,  # 'С'
-        34: 0,  # 'Т'
-        51: 0,  # 'У'
-        48: 0,  # 'Ф'
-        49: 0,  # 'Ð¥'
-        53: 0,  # 'Ц'
-        50: 0,  # 'Ч'
-        54: 0,  # 'Ш'
-        57: 0,  # 'Щ'
-        61: 0,  # 'Ъ'
-        60: 0,  # 'Ю'
-        56: 0,  # 'Я'
-        1: 1,  # 'а'
-        18: 3,  # 'б'
-        9: 3,  # 'в'
-        20: 3,  # 'г'
-        11: 3,  # 'д'
-        3: 3,  # 'е'
-        23: 3,  # 'ж'
-        15: 3,  # 'з'
-        2: 3,  # 'и'
-        26: 3,  # 'й'
-        12: 3,  # 'к'
-        10: 3,  # 'л'
-        14: 3,  # 'м'
-        6: 3,  # 'н'
-        4: 2,  # 'о'
-        13: 3,  # 'п'
-        7: 3,  # 'Ñ€'
-        8: 3,  # 'Ñ'
-        5: 3,  # 'Ñ‚'
-        19: 3,  # 'у'
-        29: 3,  # 'Ñ„'
-        25: 3,  # 'Ñ…'
-        22: 3,  # 'ц'
-        21: 3,  # 'ч'
-        27: 3,  # 'ш'
-        24: 3,  # 'щ'
-        17: 0,  # 'ÑŠ'
-        52: 0,  # 'ь'
-        42: 1,  # 'ÑŽ'
-        16: 3,  # 'Ñ'
-        58: 0,  # 'Ñ”'
-        62: 0,  # 'â„–'
-    },
-    18: {  # 'б'
-        63: 1,  # 'e'
-        45: 0,  # '\xad'
-        31: 0,  # 'Ð'
-        32: 0,  # 'Б'
-        35: 0,  # 'Ð’'
-        43: 0,  # 'Г'
-        37: 0,  # 'Д'
-        44: 0,  # 'Е'
-        55: 0,  # 'Ж'
-        47: 0,  # 'З'
-        40: 0,  # 'И'
-        59: 0,  # 'Й'
-        33: 0,  # 'К'
-        46: 0,  # 'Л'
-        38: 0,  # 'М'
-        36: 0,  # 'Ð'
-        41: 0,  # 'О'
-        30: 0,  # 'П'
-        39: 0,  # 'Р'
-        28: 0,  # 'С'
-        34: 0,  # 'Т'
-        51: 0,  # 'У'
-        48: 0,  # 'Ф'
-        49: 0,  # 'Ð¥'
-        53: 0,  # 'Ц'
-        50: 0,  # 'Ч'
-        54: 0,  # 'Ш'
-        57: 0,  # 'Щ'
-        61: 0,  # 'Ъ'
-        60: 0,  # 'Ю'
-        56: 0,  # 'Я'
-        1: 3,  # 'а'
-        18: 0,  # 'б'
-        9: 3,  # 'в'
-        20: 1,  # 'г'
-        11: 2,  # 'д'
-        3: 3,  # 'е'
-        23: 1,  # 'ж'
-        15: 1,  # 'з'
-        2: 3,  # 'и'
-        26: 0,  # 'й'
-        12: 1,  # 'к'
-        10: 3,  # 'л'
-        14: 2,  # 'м'
-        6: 3,  # 'н'
-        4: 3,  # 'о'
-        13: 1,  # 'п'
-        7: 3,  # 'Ñ€'
-        8: 3,  # 'Ñ'
-        5: 0,  # 'Ñ‚'
-        19: 3,  # 'у'
-        29: 0,  # 'Ñ„'
-        25: 2,  # 'Ñ…'
-        22: 1,  # 'ц'
-        21: 1,  # 'ч'
-        27: 1,  # 'ш'
-        24: 3,  # 'щ'
-        17: 3,  # 'ÑŠ'
-        52: 1,  # 'ь'
-        42: 2,  # 'ÑŽ'
-        16: 3,  # 'Ñ'
-        58: 0,  # 'Ñ”'
-        62: 0,  # 'â„–'
-    },
-    9: {  # 'в'
-        63: 1,  # 'e'
-        45: 1,  # '\xad'
-        31: 0,  # 'Ð'
-        32: 1,  # 'Б'
-        35: 0,  # 'Ð’'
-        43: 0,  # 'Г'
-        37: 0,  # 'Д'
-        44: 0,  # 'Е'
-        55: 0,  # 'Ж'
-        47: 0,  # 'З'
-        40: 0,  # 'И'
-        59: 0,  # 'Й'
-        33: 0,  # 'К'
-        46: 0,  # 'Л'
-        38: 0,  # 'М'
-        36: 0,  # 'Ð'
-        41: 0,  # 'О'
-        30: 0,  # 'П'
-        39: 0,  # 'Р'
-        28: 0,  # 'С'
-        34: 0,  # 'Т'
-        51: 0,  # 'У'
-        48: 1,  # 'Ф'
-        49: 0,  # 'Ð¥'
-        53: 0,  # 'Ц'
-        50: 0,  # 'Ч'
-        54: 0,  # 'Ш'
-        57: 0,  # 'Щ'
-        61: 0,  # 'Ъ'
-        60: 0,  # 'Ю'
-        56: 0,  # 'Я'
-        1: 3,  # 'а'
-        18: 1,  # 'б'
-        9: 0,  # 'в'
-        20: 2,  # 'г'
-        11: 3,  # 'д'
-        3: 3,  # 'е'
-        23: 1,  # 'ж'
-        15: 3,  # 'з'
-        2: 3,  # 'и'
-        26: 0,  # 'й'
-        12: 3,  # 'к'
-        10: 3,  # 'л'
-        14: 2,  # 'м'
-        6: 3,  # 'н'
-        4: 3,  # 'о'
-        13: 2,  # 'п'
-        7: 3,  # 'Ñ€'
-        8: 3,  # 'Ñ'
-        5: 3,  # 'Ñ‚'
-        19: 2,  # 'у'
-        29: 0,  # 'Ñ„'
-        25: 2,  # 'Ñ…'
-        22: 2,  # 'ц'
-        21: 3,  # 'ч'
-        27: 2,  # 'ш'
-        24: 1,  # 'щ'
-        17: 3,  # 'ÑŠ'
-        52: 1,  # 'ь'
-        42: 2,  # 'ÑŽ'
-        16: 3,  # 'Ñ'
-        58: 0,  # 'Ñ”'
-        62: 0,  # 'â„–'
-    },
-    20: {  # 'г'
-        63: 0,  # 'e'
-        45: 0,  # '\xad'
-        31: 0,  # 'Ð'
-        32: 0,  # 'Б'
-        35: 0,  # 'Ð’'
-        43: 0,  # 'Г'
-        37: 0,  # 'Д'
-        44: 0,  # 'Е'
-        55: 0,  # 'Ж'
-        47: 0,  # 'З'
-        40: 0,  # 'И'
-        59: 0,  # 'Й'
-        33: 0,  # 'К'
-        46: 0,  # 'Л'
-        38: 0,  # 'М'
-        36: 0,  # 'Ð'
-        41: 0,  # 'О'
-        30: 0,  # 'П'
-        39: 0,  # 'Р'
-        28: 0,  # 'С'
-        34: 0,  # 'Т'
-        51: 0,  # 'У'
-        48: 0,  # 'Ф'
-        49: 0,  # 'Ð¥'
-        53: 0,  # 'Ц'
-        50: 0,  # 'Ч'
-        54: 0,  # 'Ш'
-        57: 0,  # 'Щ'
-        61: 0,  # 'Ъ'
-        60: 0,  # 'Ю'
-        56: 0,  # 'Я'
-        1: 3,  # 'а'
-        18: 1,  # 'б'
-        9: 2,  # 'в'
-        20: 1,  # 'г'
-        11: 2,  # 'д'
-        3: 3,  # 'е'
-        23: 0,  # 'ж'
-        15: 1,  # 'з'
-        2: 3,  # 'и'
-        26: 0,  # 'й'
-        12: 1,  # 'к'
-        10: 3,  # 'л'
-        14: 1,  # 'м'
-        6: 3,  # 'н'
-        4: 3,  # 'о'
-        13: 1,  # 'п'
-        7: 3,  # 'Ñ€'
-        8: 2,  # 'Ñ'
-        5: 2,  # 'Ñ‚'
-        19: 3,  # 'у'
-        29: 1,  # 'Ñ„'
-        25: 1,  # 'Ñ…'
-        22: 0,  # 'ц'
-        21: 1,  # 'ч'
-        27: 0,  # 'ш'
-        24: 0,  # 'щ'
-        17: 3,  # 'ÑŠ'
-        52: 1,  # 'ь'
-        42: 1,  # 'ÑŽ'
-        16: 1,  # 'Ñ'
-        58: 0,  # 'Ñ”'
-        62: 0,  # 'â„–'
-    },
-    11: {  # 'д'
-        63: 1,  # 'e'
-        45: 0,  # '\xad'
-        31: 0,  # 'Ð'
-        32: 0,  # 'Б'
-        35: 0,  # 'Ð’'
-        43: 0,  # 'Г'
-        37: 0,  # 'Д'
-        44: 0,  # 'Е'
-        55: 0,  # 'Ж'
-        47: 0,  # 'З'
-        40: 0,  # 'И'
-        59: 0,  # 'Й'
-        33: 0,  # 'К'
-        46: 0,  # 'Л'
-        38: 0,  # 'М'
-        36: 0,  # 'Ð'
-        41: 0,  # 'О'
-        30: 0,  # 'П'
-        39: 0,  # 'Р'
-        28: 0,  # 'С'
-        34: 0,  # 'Т'
-        51: 0,  # 'У'
-        48: 0,  # 'Ф'
-        49: 0,  # 'Ð¥'
-        53: 0,  # 'Ц'
-        50: 0,  # 'Ч'
-        54: 0,  # 'Ш'
-        57: 0,  # 'Щ'
-        61: 0,  # 'Ъ'
-        60: 0,  # 'Ю'
-        56: 0,  # 'Я'
-        1: 3,  # 'а'
-        18: 2,  # 'б'
-        9: 3,  # 'в'
-        20: 2,  # 'г'
-        11: 2,  # 'д'
-        3: 3,  # 'е'
-        23: 3,  # 'ж'
-        15: 2,  # 'з'
-        2: 3,  # 'и'
-        26: 0,  # 'й'
-        12: 3,  # 'к'
-        10: 3,  # 'л'
-        14: 3,  # 'м'
-        6: 3,  # 'н'
-        4: 3,  # 'о'
-        13: 3,  # 'п'
-        7: 3,  # 'Ñ€'
-        8: 3,  # 'Ñ'
-        5: 1,  # 'Ñ‚'
-        19: 3,  # 'у'
-        29: 1,  # 'Ñ„'
-        25: 2,  # 'Ñ…'
-        22: 2,  # 'ц'
-        21: 2,  # 'ч'
-        27: 1,  # 'ш'
-        24: 1,  # 'щ'
-        17: 3,  # 'ÑŠ'
-        52: 1,  # 'ь'
-        42: 1,  # 'ÑŽ'
-        16: 3,  # 'Ñ'
-        58: 0,  # 'Ñ”'
-        62: 0,  # 'â„–'
-    },
-    3: {  # 'е'
-        63: 0,  # 'e'
-        45: 1,  # '\xad'
-        31: 0,  # 'Ð'
-        32: 0,  # 'Б'
-        35: 0,  # 'Ð’'
-        43: 0,  # 'Г'
-        37: 0,  # 'Д'
-        44: 0,  # 'Е'
-        55: 0,  # 'Ж'
-        47: 0,  # 'З'
-        40: 0,  # 'И'
-        59: 0,  # 'Й'
-        33: 0,  # 'К'
-        46: 0,  # 'Л'
-        38: 0,  # 'М'
-        36: 0,  # 'Ð'
-        41: 0,  # 'О'
-        30: 0,  # 'П'
-        39: 0,  # 'Р'
-        28: 0,  # 'С'
-        34: 0,  # 'Т'
-        51: 0,  # 'У'
-        48: 0,  # 'Ф'
-        49: 0,  # 'Ð¥'
-        53: 0,  # 'Ц'
-        50: 0,  # 'Ч'
-        54: 0,  # 'Ш'
-        57: 0,  # 'Щ'
-        61: 0,  # 'Ъ'
-        60: 0,  # 'Ю'
-        56: 0,  # 'Я'
-        1: 2,  # 'а'
-        18: 3,  # 'б'
-        9: 3,  # 'в'
-        20: 3,  # 'г'
-        11: 3,  # 'д'
-        3: 2,  # 'е'
-        23: 3,  # 'ж'
-        15: 3,  # 'з'
-        2: 2,  # 'и'
-        26: 3,  # 'й'
-        12: 3,  # 'к'
-        10: 3,  # 'л'
-        14: 3,  # 'м'
-        6: 3,  # 'н'
-        4: 3,  # 'о'
-        13: 3,  # 'п'
-        7: 3,  # 'Ñ€'
-        8: 3,  # 'Ñ'
-        5: 3,  # 'Ñ‚'
-        19: 2,  # 'у'
-        29: 3,  # 'Ñ„'
-        25: 3,  # 'Ñ…'
-        22: 3,  # 'ц'
-        21: 3,  # 'ч'
-        27: 3,  # 'ш'
-        24: 3,  # 'щ'
-        17: 1,  # 'ÑŠ'
-        52: 0,  # 'ь'
-        42: 1,  # 'ÑŽ'
-        16: 3,  # 'Ñ'
-        58: 0,  # 'Ñ”'
-        62: 0,  # 'â„–'
-    },
-    23: {  # 'ж'
-        63: 0,  # 'e'
-        45: 0,  # '\xad'
-        31: 0,  # 'Ð'
-        32: 0,  # 'Б'
-        35: 0,  # 'Ð’'
-        43: 0,  # 'Г'
-        37: 0,  # 'Д'
-        44: 0,  # 'Е'
-        55: 0,  # 'Ж'
-        47: 0,  # 'З'
-        40: 0,  # 'И'
-        59: 0,  # 'Й'
-        33: 0,  # 'К'
-        46: 0,  # 'Л'
-        38: 0,  # 'М'
-        36: 0,  # 'Ð'
-        41: 0,  # 'О'
-        30: 0,  # 'П'
-        39: 0,  # 'Р'
-        28: 0,  # 'С'
-        34: 0,  # 'Т'
-        51: 0,  # 'У'
-        48: 0,  # 'Ф'
-        49: 0,  # 'Ð¥'
-        53: 0,  # 'Ц'
-        50: 0,  # 'Ч'
-        54: 0,  # 'Ш'
-        57: 0,  # 'Щ'
-        61: 0,  # 'Ъ'
-        60: 0,  # 'Ю'
-        56: 0,  # 'Я'
-        1: 3,  # 'а'
-        18: 3,  # 'б'
-        9: 2,  # 'в'
-        20: 1,  # 'г'
-        11: 3,  # 'д'
-        3: 3,  # 'е'
-        23: 0,  # 'ж'
-        15: 0,  # 'з'
-        2: 3,  # 'и'
-        26: 0,  # 'й'
-        12: 2,  # 'к'
-        10: 1,  # 'л'
-        14: 1,  # 'м'
-        6: 3,  # 'н'
-        4: 2,  # 'о'
-        13: 1,  # 'п'
-        7: 1,  # 'Ñ€'
-        8: 1,  # 'Ñ'
-        5: 1,  # 'Ñ‚'
-        19: 2,  # 'у'
-        29: 0,  # 'Ñ„'
-        25: 0,  # 'Ñ…'
-        22: 1,  # 'ц'
-        21: 1,  # 'ч'
-        27: 0,  # 'ш'
-        24: 0,  # 'щ'
-        17: 2,  # 'ÑŠ'
-        52: 0,  # 'ь'
-        42: 0,  # 'ÑŽ'
-        16: 1,  # 'Ñ'
-        58: 0,  # 'Ñ”'
-        62: 0,  # 'â„–'
-    },
-    15: {  # 'з'
-        63: 1,  # 'e'
-        45: 0,  # '\xad'
-        31: 0,  # 'Ð'
-        32: 0,  # 'Б'
-        35: 0,  # 'Ð’'
-        43: 0,  # 'Г'
-        37: 0,  # 'Д'
-        44: 0,  # 'Е'
-        55: 0,  # 'Ж'
-        47: 0,  # 'З'
-        40: 0,  # 'И'
-        59: 0,  # 'Й'
-        33: 0,  # 'К'
-        46: 0,  # 'Л'
-        38: 0,  # 'М'
-        36: 0,  # 'Ð'
-        41: 0,  # 'О'
-        30: 0,  # 'П'
-        39: 0,  # 'Р'
-        28: 0,  # 'С'
-        34: 0,  # 'Т'
-        51: 0,  # 'У'
-        48: 0,  # 'Ф'
-        49: 0,  # 'Ð¥'
-        53: 0,  # 'Ц'
-        50: 0,  # 'Ч'
-        54: 0,  # 'Ш'
-        57: 0,  # 'Щ'
-        61: 0,  # 'Ъ'
-        60: 0,  # 'Ю'
-        56: 0,  # 'Я'
-        1: 3,  # 'а'
-        18: 3,  # 'б'
-        9: 3,  # 'в'
-        20: 3,  # 'г'
-        11: 3,  # 'д'
-        3: 3,  # 'е'
-        23: 1,  # 'ж'
-        15: 1,  # 'з'
-        2: 3,  # 'и'
-        26: 0,  # 'й'
-        12: 3,  # 'к'
-        10: 3,  # 'л'
-        14: 3,  # 'м'
-        6: 3,  # 'н'
-        4: 3,  # 'о'
-        13: 3,  # 'п'
-        7: 3,  # 'Ñ€'
-        8: 3,  # 'Ñ'
-        5: 3,  # 'Ñ‚'
-        19: 3,  # 'у'
-        29: 1,  # 'Ñ„'
-        25: 2,  # 'Ñ…'
-        22: 2,  # 'ц'
-        21: 2,  # 'ч'
-        27: 2,  # 'ш'
-        24: 1,  # 'щ'
-        17: 2,  # 'ÑŠ'
-        52: 1,  # 'ь'
-        42: 1,  # 'ÑŽ'
-        16: 2,  # 'Ñ'
-        58: 0,  # 'Ñ”'
-        62: 0,  # 'â„–'
-    },
-    2: {  # 'и'
-        63: 1,  # 'e'
-        45: 1,  # '\xad'
-        31: 0,  # 'Ð'
-        32: 0,  # 'Б'
-        35: 0,  # 'Ð’'
-        43: 1,  # 'Г'
-        37: 0,  # 'Д'
-        44: 0,  # 'Е'
-        55: 0,  # 'Ж'
-        47: 0,  # 'З'
-        40: 0,  # 'И'
-        59: 0,  # 'Й'
-        33: 1,  # 'К'
-        46: 0,  # 'Л'
-        38: 0,  # 'М'
-        36: 0,  # 'Ð'
-        41: 0,  # 'О'
-        30: 1,  # 'П'
-        39: 0,  # 'Р'
-        28: 0,  # 'С'
-        34: 0,  # 'Т'
-        51: 0,  # 'У'
-        48: 1,  # 'Ф'
-        49: 0,  # 'Ð¥'
-        53: 0,  # 'Ц'
-        50: 0,  # 'Ч'
-        54: 0,  # 'Ш'
-        57: 0,  # 'Щ'
-        61: 0,  # 'Ъ'
-        60: 0,  # 'Ю'
-        56: 0,  # 'Я'
-        1: 3,  # 'а'
-        18: 3,  # 'б'
-        9: 3,  # 'в'
-        20: 3,  # 'г'
-        11: 3,  # 'д'
-        3: 3,  # 'е'
-        23: 3,  # 'ж'
-        15: 3,  # 'з'
-        2: 3,  # 'и'
-        26: 3,  # 'й'
-        12: 3,  # 'к'
-        10: 3,  # 'л'
-        14: 3,  # 'м'
-        6: 3,  # 'н'
-        4: 3,  # 'о'
-        13: 3,  # 'п'
-        7: 3,  # 'Ñ€'
-        8: 3,  # 'Ñ'
-        5: 3,  # 'Ñ‚'
-        19: 2,  # 'у'
-        29: 3,  # 'Ñ„'
-        25: 3,  # 'Ñ…'
-        22: 3,  # 'ц'
-        21: 3,  # 'ч'
-        27: 3,  # 'ш'
-        24: 3,  # 'щ'
-        17: 2,  # 'ÑŠ'
-        52: 0,  # 'ь'
-        42: 1,  # 'ÑŽ'
-        16: 3,  # 'Ñ'
-        58: 0,  # 'Ñ”'
-        62: 0,  # 'â„–'
-    },
-    26: {  # 'й'
-        63: 0,  # 'e'
-        45: 0,  # '\xad'
-        31: 0,  # 'Ð'
-        32: 0,  # 'Б'
-        35: 0,  # 'Ð’'
-        43: 0,  # 'Г'
-        37: 0,  # 'Д'
-        44: 0,  # 'Е'
-        55: 0,  # 'Ж'
-        47: 0,  # 'З'
-        40: 0,  # 'И'
-        59: 0,  # 'Й'
-        33: 0,  # 'К'
-        46: 0,  # 'Л'
-        38: 0,  # 'М'
-        36: 0,  # 'Ð'
-        41: 0,  # 'О'
-        30: 0,  # 'П'
-        39: 0,  # 'Р'
-        28: 0,  # 'С'
-        34: 0,  # 'Т'
-        51: 0,  # 'У'
-        48: 0,  # 'Ф'
-        49: 0,  # 'Ð¥'
-        53: 0,  # 'Ц'
-        50: 0,  # 'Ч'
-        54: 0,  # 'Ш'
-        57: 0,  # 'Щ'
-        61: 0,  # 'Ъ'
-        60: 0,  # 'Ю'
-        56: 0,  # 'Я'
-        1: 1,  # 'а'
-        18: 2,  # 'б'
-        9: 2,  # 'в'
-        20: 1,  # 'г'
-        11: 2,  # 'д'
-        3: 2,  # 'е'
-        23: 0,  # 'ж'
-        15: 2,  # 'з'
-        2: 1,  # 'и'
-        26: 0,  # 'й'
-        12: 3,  # 'к'
-        10: 2,  # 'л'
-        14: 2,  # 'м'
-        6: 3,  # 'н'
-        4: 2,  # 'о'
-        13: 1,  # 'п'
-        7: 2,  # 'Ñ€'
-        8: 3,  # 'Ñ'
-        5: 3,  # 'Ñ‚'
-        19: 1,  # 'у'
-        29: 2,  # 'Ñ„'
-        25: 1,  # 'Ñ…'
-        22: 2,  # 'ц'
-        21: 2,  # 'ч'
-        27: 1,  # 'ш'
-        24: 1,  # 'щ'
-        17: 1,  # 'ÑŠ'
-        52: 0,  # 'ь'
-        42: 0,  # 'ÑŽ'
-        16: 1,  # 'Ñ'
-        58: 0,  # 'Ñ”'
-        62: 0,  # 'â„–'
-    },
-    12: {  # 'к'
-        63: 1,  # 'e'
-        45: 0,  # '\xad'
-        31: 0,  # 'Ð'
-        32: 0,  # 'Б'
-        35: 1,  # 'Ð’'
-        43: 0,  # 'Г'
-        37: 0,  # 'Д'
-        44: 0,  # 'Е'
-        55: 0,  # 'Ж'
-        47: 0,  # 'З'
-        40: 1,  # 'И'
-        59: 0,  # 'Й'
-        33: 0,  # 'К'
-        46: 0,  # 'Л'
-        38: 0,  # 'М'
-        36: 0,  # 'Ð'
-        41: 0,  # 'О'
-        30: 0,  # 'П'
-        39: 0,  # 'Р'
-        28: 0,  # 'С'
-        34: 0,  # 'Т'
-        51: 0,  # 'У'
-        48: 0,  # 'Ф'
-        49: 0,  # 'Ð¥'
-        53: 0,  # 'Ц'
-        50: 0,  # 'Ч'
-        54: 0,  # 'Ш'
-        57: 0,  # 'Щ'
-        61: 0,  # 'Ъ'
-        60: 0,  # 'Ю'
-        56: 0,  # 'Я'
-        1: 3,  # 'а'
-        18: 1,  # 'б'
-        9: 3,  # 'в'
-        20: 2,  # 'г'
-        11: 1,  # 'д'
-        3: 3,  # 'е'
-        23: 0,  # 'ж'
-        15: 2,  # 'з'
-        2: 3,  # 'и'
-        26: 0,  # 'й'
-        12: 1,  # 'к'
-        10: 3,  # 'л'
-        14: 2,  # 'м'
-        6: 3,  # 'н'
-        4: 3,  # 'о'
-        13: 1,  # 'п'
-        7: 3,  # 'Ñ€'
-        8: 3,  # 'Ñ'
-        5: 3,  # 'Ñ‚'
-        19: 3,  # 'у'
-        29: 1,  # 'Ñ„'
-        25: 1,  # 'Ñ…'
-        22: 3,  # 'ц'
-        21: 2,  # 'ч'
-        27: 1,  # 'ш'
-        24: 0,  # 'щ'
-        17: 3,  # 'ÑŠ'
-        52: 1,  # 'ь'
-        42: 2,  # 'ÑŽ'
-        16: 1,  # 'Ñ'
-        58: 0,  # 'Ñ”'
-        62: 0,  # 'â„–'
-    },
-    10: {  # 'л'
-        63: 1,  # 'e'
-        45: 1,  # '\xad'
-        31: 0,  # 'Ð'
-        32: 0,  # 'Б'
-        35: 0,  # 'Ð’'
-        43: 0,  # 'Г'
-        37: 0,  # 'Д'
-        44: 0,  # 'Е'
-        55: 0,  # 'Ж'
-        47: 0,  # 'З'
-        40: 0,  # 'И'
-        59: 0,  # 'Й'
-        33: 0,  # 'К'
-        46: 0,  # 'Л'
-        38: 0,  # 'М'
-        36: 0,  # 'Ð'
-        41: 0,  # 'О'
-        30: 0,  # 'П'
-        39: 0,  # 'Р'
-        28: 1,  # 'С'
-        34: 0,  # 'Т'
-        51: 0,  # 'У'
-        48: 0,  # 'Ф'
-        49: 0,  # 'Ð¥'
-        53: 0,  # 'Ц'
-        50: 0,  # 'Ч'
-        54: 0,  # 'Ш'
-        57: 0,  # 'Щ'
-        61: 0,  # 'Ъ'
-        60: 0,  # 'Ю'
-        56: 0,  # 'Я'
-        1: 3,  # 'а'
-        18: 3,  # 'б'
-        9: 3,  # 'в'
-        20: 3,  # 'г'
-        11: 2,  # 'д'
-        3: 3,  # 'е'
-        23: 3,  # 'ж'
-        15: 2,  # 'з'
-        2: 3,  # 'и'
-        26: 0,  # 'й'
-        12: 3,  # 'к'
-        10: 1,  # 'л'
-        14: 2,  # 'м'
-        6: 3,  # 'н'
-        4: 3,  # 'о'
-        13: 2,  # 'п'
-        7: 2,  # 'Ñ€'
-        8: 3,  # 'Ñ'
-        5: 3,  # 'Ñ‚'
-        19: 3,  # 'у'
-        29: 2,  # 'Ñ„'
-        25: 2,  # 'Ñ…'
-        22: 2,  # 'ц'
-        21: 2,  # 'ч'
-        27: 2,  # 'ш'
-        24: 1,  # 'щ'
-        17: 3,  # 'ÑŠ'
-        52: 2,  # 'ь'
-        42: 3,  # 'ÑŽ'
-        16: 3,  # 'Ñ'
-        58: 0,  # 'Ñ”'
-        62: 0,  # 'â„–'
-    },
-    14: {  # 'м'
-        63: 1,  # 'e'
-        45: 0,  # '\xad'
-        31: 1,  # 'Ð'
-        32: 0,  # 'Б'
-        35: 0,  # 'Ð’'
-        43: 0,  # 'Г'
-        37: 0,  # 'Д'
-        44: 0,  # 'Е'
-        55: 0,  # 'Ж'
-        47: 0,  # 'З'
-        40: 0,  # 'И'
-        59: 0,  # 'Й'
-        33: 0,  # 'К'
-        46: 0,  # 'Л'
-        38: 0,  # 'М'
-        36: 0,  # 'Ð'
-        41: 0,  # 'О'
-        30: 0,  # 'П'
-        39: 0,  # 'Р'
-        28: 0,  # 'С'
-        34: 0,  # 'Т'
-        51: 0,  # 'У'
-        48: 0,  # 'Ф'
-        49: 0,  # 'Ð¥'
-        53: 0,  # 'Ц'
-        50: 0,  # 'Ч'
-        54: 0,  # 'Ш'
-        57: 0,  # 'Щ'
-        61: 0,  # 'Ъ'
-        60: 0,  # 'Ю'
-        56: 0,  # 'Я'
-        1: 3,  # 'а'
-        18: 3,  # 'б'
-        9: 3,  # 'в'
-        20: 1,  # 'г'
-        11: 1,  # 'д'
-        3: 3,  # 'е'
-        23: 1,  # 'ж'
-        15: 1,  # 'з'
-        2: 3,  # 'и'
-        26: 0,  # 'й'
-        12: 2,  # 'к'
-        10: 3,  # 'л'
-        14: 1,  # 'м'
-        6: 3,  # 'н'
-        4: 3,  # 'о'
-        13: 3,  # 'п'
-        7: 2,  # 'Ñ€'
-        8: 2,  # 'Ñ'
-        5: 1,  # 'Ñ‚'
-        19: 3,  # 'у'
-        29: 2,  # 'Ñ„'
-        25: 1,  # 'Ñ…'
-        22: 2,  # 'ц'
-        21: 2,  # 'ч'
-        27: 2,  # 'ш'
-        24: 1,  # 'щ'
-        17: 3,  # 'ÑŠ'
-        52: 1,  # 'ь'
-        42: 2,  # 'ÑŽ'
-        16: 3,  # 'Ñ'
-        58: 0,  # 'Ñ”'
-        62: 0,  # 'â„–'
-    },
-    6: {  # 'н'
-        63: 1,  # 'e'
-        45: 0,  # '\xad'
-        31: 0,  # 'Ð'
-        32: 0,  # 'Б'
-        35: 0,  # 'Ð’'
-        43: 0,  # 'Г'
-        37: 0,  # 'Д'
-        44: 0,  # 'Е'
-        55: 0,  # 'Ж'
-        47: 0,  # 'З'
-        40: 0,  # 'И'
-        59: 0,  # 'Й'
-        33: 0,  # 'К'
-        46: 0,  # 'Л'
-        38: 0,  # 'М'
-        36: 0,  # 'Ð'
-        41: 0,  # 'О'
-        30: 0,  # 'П'
-        39: 1,  # 'Р'
-        28: 0,  # 'С'
-        34: 0,  # 'Т'
-        51: 0,  # 'У'
-        48: 0,  # 'Ф'
-        49: 0,  # 'Ð¥'
-        53: 0,  # 'Ц'
-        50: 0,  # 'Ч'
-        54: 0,  # 'Ш'
-        57: 0,  # 'Щ'
-        61: 0,  # 'Ъ'
-        60: 0,  # 'Ю'
-        56: 0,  # 'Я'
-        1: 3,  # 'а'
-        18: 2,  # 'б'
-        9: 2,  # 'в'
-        20: 3,  # 'г'
-        11: 3,  # 'д'
-        3: 3,  # 'е'
-        23: 2,  # 'ж'
-        15: 2,  # 'з'
-        2: 3,  # 'и'
-        26: 0,  # 'й'
-        12: 3,  # 'к'
-        10: 2,  # 'л'
-        14: 1,  # 'м'
-        6: 3,  # 'н'
-        4: 3,  # 'о'
-        13: 1,  # 'п'
-        7: 2,  # 'Ñ€'
-        8: 3,  # 'Ñ'
-        5: 3,  # 'Ñ‚'
-        19: 3,  # 'у'
-        29: 3,  # 'Ñ„'
-        25: 2,  # 'Ñ…'
-        22: 3,  # 'ц'
-        21: 3,  # 'ч'
-        27: 2,  # 'ш'
-        24: 1,  # 'щ'
-        17: 3,  # 'ÑŠ'
-        52: 2,  # 'ь'
-        42: 2,  # 'ÑŽ'
-        16: 3,  # 'Ñ'
-        58: 0,  # 'Ñ”'
-        62: 0,  # 'â„–'
-    },
-    4: {  # 'о'
-        63: 0,  # 'e'
-        45: 1,  # '\xad'
-        31: 0,  # 'Ð'
-        32: 0,  # 'Б'
-        35: 0,  # 'Ð’'
-        43: 0,  # 'Г'
-        37: 0,  # 'Д'
-        44: 0,  # 'Е'
-        55: 0,  # 'Ж'
-        47: 0,  # 'З'
-        40: 0,  # 'И'
-        59: 0,  # 'Й'
-        33: 0,  # 'К'
-        46: 0,  # 'Л'
-        38: 0,  # 'М'
-        36: 0,  # 'Ð'
-        41: 0,  # 'О'
-        30: 0,  # 'П'
-        39: 0,  # 'Р'
-        28: 0,  # 'С'
-        34: 0,  # 'Т'
-        51: 0,  # 'У'
-        48: 0,  # 'Ф'
-        49: 0,  # 'Ð¥'
-        53: 0,  # 'Ц'
-        50: 0,  # 'Ч'
-        54: 0,  # 'Ш'
-        57: 0,  # 'Щ'
-        61: 0,  # 'Ъ'
-        60: 0,  # 'Ю'
-        56: 0,  # 'Я'
-        1: 2,  # 'а'
-        18: 3,  # 'б'
-        9: 3,  # 'в'
-        20: 3,  # 'г'
-        11: 3,  # 'д'
-        3: 3,  # 'е'
-        23: 3,  # 'ж'
-        15: 3,  # 'з'
-        2: 3,  # 'и'
-        26: 3,  # 'й'
-        12: 3,  # 'к'
-        10: 3,  # 'л'
-        14: 3,  # 'м'
-        6: 3,  # 'н'
-        4: 2,  # 'о'
-        13: 3,  # 'п'
-        7: 3,  # 'Ñ€'
-        8: 3,  # 'Ñ'
-        5: 3,  # 'Ñ‚'
-        19: 2,  # 'у'
-        29: 3,  # 'Ñ„'
-        25: 3,  # 'Ñ…'
-        22: 3,  # 'ц'
-        21: 3,  # 'ч'
-        27: 3,  # 'ш'
-        24: 3,  # 'щ'
-        17: 1,  # 'ÑŠ'
-        52: 0,  # 'ь'
-        42: 1,  # 'ÑŽ'
-        16: 3,  # 'Ñ'
-        58: 0,  # 'Ñ”'
-        62: 0,  # 'â„–'
-    },
-    13: {  # 'п'
-        63: 1,  # 'e'
-        45: 0,  # '\xad'
-        31: 0,  # 'Ð'
-        32: 0,  # 'Б'
-        35: 0,  # 'Ð’'
-        43: 0,  # 'Г'
-        37: 0,  # 'Д'
-        44: 0,  # 'Е'
-        55: 0,  # 'Ж'
-        47: 0,  # 'З'
-        40: 0,  # 'И'
-        59: 0,  # 'Й'
-        33: 0,  # 'К'
-        46: 0,  # 'Л'
-        38: 0,  # 'М'
-        36: 0,  # 'Ð'
-        41: 0,  # 'О'
-        30: 0,  # 'П'
-        39: 0,  # 'Р'
-        28: 0,  # 'С'
-        34: 0,  # 'Т'
-        51: 0,  # 'У'
-        48: 0,  # 'Ф'
-        49: 0,  # 'Ð¥'
-        53: 0,  # 'Ц'
-        50: 0,  # 'Ч'
-        54: 0,  # 'Ш'
-        57: 0,  # 'Щ'
-        61: 0,  # 'Ъ'
-        60: 0,  # 'Ю'
-        56: 0,  # 'Я'
-        1: 3,  # 'а'
-        18: 1,  # 'б'
-        9: 2,  # 'в'
-        20: 1,  # 'г'
-        11: 1,  # 'д'
-        3: 3,  # 'е'
-        23: 0,  # 'ж'
-        15: 1,  # 'з'
-        2: 3,  # 'и'
-        26: 1,  # 'й'
-        12: 2,  # 'к'
-        10: 3,  # 'л'
-        14: 1,  # 'м'
-        6: 2,  # 'н'
-        4: 3,  # 'о'
-        13: 1,  # 'п'
-        7: 3,  # 'Ñ€'
-        8: 2,  # 'Ñ'
-        5: 2,  # 'Ñ‚'
-        19: 3,  # 'у'
-        29: 1,  # 'Ñ„'
-        25: 1,  # 'Ñ…'
-        22: 2,  # 'ц'
-        21: 2,  # 'ч'
-        27: 1,  # 'ш'
-        24: 1,  # 'щ'
-        17: 3,  # 'ÑŠ'
-        52: 1,  # 'ь'
-        42: 2,  # 'ÑŽ'
-        16: 2,  # 'Ñ'
-        58: 0,  # 'Ñ”'
-        62: 0,  # 'â„–'
-    },
-    7: {  # 'Ñ€'
-        63: 1,  # 'e'
-        45: 0,  # '\xad'
-        31: 0,  # 'Ð'
-        32: 0,  # 'Б'
-        35: 0,  # 'Ð’'
-        43: 0,  # 'Г'
-        37: 0,  # 'Д'
-        44: 0,  # 'Е'
-        55: 0,  # 'Ж'
-        47: 0,  # 'З'
-        40: 0,  # 'И'
-        59: 0,  # 'Й'
-        33: 0,  # 'К'
-        46: 0,  # 'Л'
-        38: 0,  # 'М'
-        36: 0,  # 'Ð'
-        41: 0,  # 'О'
-        30: 0,  # 'П'
-        39: 0,  # 'Р'
-        28: 0,  # 'С'
-        34: 0,  # 'Т'
-        51: 0,  # 'У'
-        48: 0,  # 'Ф'
-        49: 0,  # 'Ð¥'
-        53: 0,  # 'Ц'
-        50: 0,  # 'Ч'
-        54: 0,  # 'Ш'
-        57: 0,  # 'Щ'
-        61: 0,  # 'Ъ'
-        60: 0,  # 'Ю'
-        56: 0,  # 'Я'
-        1: 3,  # 'а'
-        18: 3,  # 'б'
-        9: 3,  # 'в'
-        20: 3,  # 'г'
-        11: 3,  # 'д'
-        3: 3,  # 'е'
-        23: 3,  # 'ж'
-        15: 2,  # 'з'
-        2: 3,  # 'и'
-        26: 0,  # 'й'
-        12: 3,  # 'к'
-        10: 3,  # 'л'
-        14: 3,  # 'м'
-        6: 3,  # 'н'
-        4: 3,  # 'о'
-        13: 2,  # 'п'
-        7: 1,  # 'Ñ€'
-        8: 3,  # 'Ñ'
-        5: 3,  # 'Ñ‚'
-        19: 3,  # 'у'
-        29: 2,  # 'Ñ„'
-        25: 3,  # 'Ñ…'
-        22: 3,  # 'ц'
-        21: 2,  # 'ч'
-        27: 3,  # 'ш'
-        24: 1,  # 'щ'
-        17: 3,  # 'ÑŠ'
-        52: 1,  # 'ь'
-        42: 2,  # 'ÑŽ'
-        16: 3,  # 'Ñ'
-        58: 0,  # 'Ñ”'
-        62: 0,  # 'â„–'
-    },
-    8: {  # 'Ñ'
-        63: 1,  # 'e'
-        45: 0,  # '\xad'
-        31: 0,  # 'Ð'
-        32: 0,  # 'Б'
-        35: 0,  # 'Ð’'
-        43: 0,  # 'Г'
-        37: 0,  # 'Д'
-        44: 0,  # 'Е'
-        55: 0,  # 'Ж'
-        47: 0,  # 'З'
-        40: 0,  # 'И'
-        59: 0,  # 'Й'
-        33: 0,  # 'К'
-        46: 0,  # 'Л'
-        38: 0,  # 'М'
-        36: 0,  # 'Ð'
-        41: 0,  # 'О'
-        30: 0,  # 'П'
-        39: 0,  # 'Р'
-        28: 0,  # 'С'
-        34: 0,  # 'Т'
-        51: 0,  # 'У'
-        48: 0,  # 'Ф'
-        49: 0,  # 'Ð¥'
-        53: 0,  # 'Ц'
-        50: 0,  # 'Ч'
-        54: 0,  # 'Ш'
-        57: 0,  # 'Щ'
-        61: 0,  # 'Ъ'
-        60: 0,  # 'Ю'
-        56: 0,  # 'Я'
-        1: 3,  # 'а'
-        18: 2,  # 'б'
-        9: 3,  # 'в'
-        20: 2,  # 'г'
-        11: 2,  # 'д'
-        3: 3,  # 'е'
-        23: 0,  # 'ж'
-        15: 1,  # 'з'
-        2: 3,  # 'и'
-        26: 0,  # 'й'
-        12: 3,  # 'к'
-        10: 3,  # 'л'
-        14: 3,  # 'м'
-        6: 3,  # 'н'
-        4: 3,  # 'о'
-        13: 3,  # 'п'
-        7: 3,  # 'Ñ€'
-        8: 1,  # 'Ñ'
-        5: 3,  # 'Ñ‚'
-        19: 3,  # 'у'
-        29: 2,  # 'Ñ„'
-        25: 2,  # 'Ñ…'
-        22: 2,  # 'ц'
-        21: 2,  # 'ч'
-        27: 2,  # 'ш'
-        24: 0,  # 'щ'
-        17: 3,  # 'ÑŠ'
-        52: 2,  # 'ь'
-        42: 2,  # 'ÑŽ'
-        16: 3,  # 'Ñ'
-        58: 0,  # 'Ñ”'
-        62: 0,  # 'â„–'
-    },
-    5: {  # 'Ñ‚'
-        63: 1,  # 'e'
-        45: 0,  # '\xad'
-        31: 0,  # 'Ð'
-        32: 0,  # 'Б'
-        35: 0,  # 'Ð’'
-        43: 0,  # 'Г'
-        37: 0,  # 'Д'
-        44: 0,  # 'Е'
-        55: 0,  # 'Ж'
-        47: 0,  # 'З'
-        40: 0,  # 'И'
-        59: 0,  # 'Й'
-        33: 0,  # 'К'
-        46: 0,  # 'Л'
-        38: 0,  # 'М'
-        36: 0,  # 'Ð'
-        41: 0,  # 'О'
-        30: 0,  # 'П'
-        39: 0,  # 'Р'
-        28: 0,  # 'С'
-        34: 0,  # 'Т'
-        51: 0,  # 'У'
-        48: 0,  # 'Ф'
-        49: 0,  # 'Ð¥'
-        53: 0,  # 'Ц'
-        50: 0,  # 'Ч'
-        54: 0,  # 'Ш'
-        57: 0,  # 'Щ'
-        61: 0,  # 'Ъ'
-        60: 0,  # 'Ю'
-        56: 0,  # 'Я'
-        1: 3,  # 'а'
-        18: 3,  # 'б'
-        9: 3,  # 'в'
-        20: 2,  # 'г'
-        11: 2,  # 'д'
-        3: 3,  # 'е'
-        23: 1,  # 'ж'
-        15: 1,  # 'з'
-        2: 3,  # 'и'
-        26: 0,  # 'й'
-        12: 3,  # 'к'
-        10: 3,  # 'л'
-        14: 2,  # 'м'
-        6: 3,  # 'н'
-        4: 3,  # 'о'
-        13: 2,  # 'п'
-        7: 3,  # 'Ñ€'
-        8: 3,  # 'Ñ'
-        5: 3,  # 'Ñ‚'
-        19: 3,  # 'у'
-        29: 1,  # 'Ñ„'
-        25: 2,  # 'Ñ…'
-        22: 2,  # 'ц'
-        21: 2,  # 'ч'
-        27: 1,  # 'ш'
-        24: 1,  # 'щ'
-        17: 3,  # 'ÑŠ'
-        52: 2,  # 'ь'
-        42: 2,  # 'ÑŽ'
-        16: 3,  # 'Ñ'
-        58: 0,  # 'Ñ”'
-        62: 0,  # 'â„–'
-    },
-    19: {  # 'у'
-        63: 0,  # 'e'
-        45: 0,  # '\xad'
-        31: 0,  # 'Ð'
-        32: 0,  # 'Б'
-        35: 0,  # 'Ð’'
-        43: 0,  # 'Г'
-        37: 0,  # 'Д'
-        44: 0,  # 'Е'
-        55: 0,  # 'Ж'
-        47: 0,  # 'З'
-        40: 0,  # 'И'
-        59: 0,  # 'Й'
-        33: 0,  # 'К'
-        46: 0,  # 'Л'
-        38: 0,  # 'М'
-        36: 0,  # 'Ð'
-        41: 0,  # 'О'
-        30: 0,  # 'П'
-        39: 0,  # 'Р'
-        28: 0,  # 'С'
-        34: 0,  # 'Т'
-        51: 0,  # 'У'
-        48: 0,  # 'Ф'
-        49: 0,  # 'Ð¥'
-        53: 0,  # 'Ц'
-        50: 0,  # 'Ч'
-        54: 0,  # 'Ш'
-        57: 0,  # 'Щ'
-        61: 0,  # 'Ъ'
-        60: 0,  # 'Ю'
-        56: 0,  # 'Я'
-        1: 3,  # 'а'
-        18: 3,  # 'б'
-        9: 3,  # 'в'
-        20: 3,  # 'г'
-        11: 3,  # 'д'
-        3: 2,  # 'е'
-        23: 3,  # 'ж'
-        15: 3,  # 'з'
-        2: 2,  # 'и'
-        26: 2,  # 'й'
-        12: 3,  # 'к'
-        10: 3,  # 'л'
-        14: 3,  # 'м'
-        6: 3,  # 'н'
-        4: 2,  # 'о'
-        13: 3,  # 'п'
-        7: 3,  # 'Ñ€'
-        8: 3,  # 'Ñ'
-        5: 3,  # 'Ñ‚'
-        19: 1,  # 'у'
-        29: 2,  # 'Ñ„'
-        25: 2,  # 'Ñ…'
-        22: 2,  # 'ц'
-        21: 3,  # 'ч'
-        27: 3,  # 'ш'
-        24: 2,  # 'щ'
-        17: 1,  # 'ÑŠ'
-        52: 0,  # 'ь'
-        42: 1,  # 'ÑŽ'
-        16: 1,  # 'Ñ'
-        58: 0,  # 'Ñ”'
-        62: 0,  # 'â„–'
-    },
-    29: {  # 'Ñ„'
-        63: 1,  # 'e'
-        45: 0,  # '\xad'
-        31: 0,  # 'Ð'
-        32: 0,  # 'Б'
-        35: 0,  # 'Ð’'
-        43: 0,  # 'Г'
-        37: 0,  # 'Д'
-        44: 0,  # 'Е'
-        55: 0,  # 'Ж'
-        47: 0,  # 'З'
-        40: 0,  # 'И'
-        59: 0,  # 'Й'
-        33: 0,  # 'К'
-        46: 0,  # 'Л'
-        38: 0,  # 'М'
-        36: 0,  # 'Ð'
-        41: 0,  # 'О'
-        30: 0,  # 'П'
-        39: 0,  # 'Р'
-        28: 0,  # 'С'
-        34: 0,  # 'Т'
-        51: 0,  # 'У'
-        48: 0,  # 'Ф'
-        49: 0,  # 'Ð¥'
-        53: 0,  # 'Ц'
-        50: 0,  # 'Ч'
-        54: 0,  # 'Ш'
-        57: 0,  # 'Щ'
-        61: 0,  # 'Ъ'
-        60: 0,  # 'Ю'
-        56: 0,  # 'Я'
-        1: 3,  # 'а'
-        18: 1,  # 'б'
-        9: 1,  # 'в'
-        20: 1,  # 'г'
-        11: 0,  # 'д'
-        3: 3,  # 'е'
-        23: 0,  # 'ж'
-        15: 0,  # 'з'
-        2: 3,  # 'и'
-        26: 0,  # 'й'
-        12: 2,  # 'к'
-        10: 2,  # 'л'
-        14: 1,  # 'м'
-        6: 1,  # 'н'
-        4: 3,  # 'о'
-        13: 0,  # 'п'
-        7: 2,  # 'Ñ€'
-        8: 2,  # 'Ñ'
-        5: 2,  # 'Ñ‚'
-        19: 2,  # 'у'
-        29: 0,  # 'Ñ„'
-        25: 1,  # 'Ñ…'
-        22: 0,  # 'ц'
-        21: 1,  # 'ч'
-        27: 1,  # 'ш'
-        24: 0,  # 'щ'
-        17: 2,  # 'ÑŠ'
-        52: 2,  # 'ь'
-        42: 1,  # 'ÑŽ'
-        16: 1,  # 'Ñ'
-        58: 0,  # 'Ñ”'
-        62: 0,  # 'â„–'
-    },
-    25: {  # 'Ñ…'
-        63: 0,  # 'e'
-        45: 0,  # '\xad'
-        31: 0,  # 'Ð'
-        32: 0,  # 'Б'
-        35: 0,  # 'Ð’'
-        43: 0,  # 'Г'
-        37: 0,  # 'Д'
-        44: 0,  # 'Е'
-        55: 0,  # 'Ж'
-        47: 0,  # 'З'
-        40: 0,  # 'И'
-        59: 0,  # 'Й'
-        33: 0,  # 'К'
-        46: 0,  # 'Л'
-        38: 0,  # 'М'
-        36: 0,  # 'Ð'
-        41: 0,  # 'О'
-        30: 0,  # 'П'
-        39: 0,  # 'Р'
-        28: 0,  # 'С'
-        34: 0,  # 'Т'
-        51: 0,  # 'У'
-        48: 0,  # 'Ф'
-        49: 0,  # 'Ð¥'
-        53: 0,  # 'Ц'
-        50: 0,  # 'Ч'
-        54: 0,  # 'Ш'
-        57: 0,  # 'Щ'
-        61: 0,  # 'Ъ'
-        60: 0,  # 'Ю'
-        56: 0,  # 'Я'
-        1: 3,  # 'а'
-        18: 1,  # 'б'
-        9: 3,  # 'в'
-        20: 0,  # 'г'
-        11: 1,  # 'д'
-        3: 2,  # 'е'
-        23: 0,  # 'ж'
-        15: 1,  # 'з'
-        2: 3,  # 'и'
-        26: 0,  # 'й'
-        12: 1,  # 'к'
-        10: 2,  # 'л'
-        14: 2,  # 'м'
-        6: 3,  # 'н'
-        4: 3,  # 'о'
-        13: 1,  # 'п'
-        7: 3,  # 'Ñ€'
-        8: 1,  # 'Ñ'
-        5: 2,  # 'Ñ‚'
-        19: 3,  # 'у'
-        29: 0,  # 'Ñ„'
-        25: 1,  # 'Ñ…'
-        22: 0,  # 'ц'
-        21: 1,  # 'ч'
-        27: 0,  # 'ш'
-        24: 0,  # 'щ'
-        17: 2,  # 'ÑŠ'
-        52: 0,  # 'ь'
-        42: 1,  # 'ÑŽ'
-        16: 1,  # 'Ñ'
-        58: 0,  # 'Ñ”'
-        62: 0,  # 'â„–'
-    },
-    22: {  # 'ц'
-        63: 1,  # 'e'
-        45: 0,  # '\xad'
-        31: 0,  # 'Ð'
-        32: 0,  # 'Б'
-        35: 0,  # 'Ð’'
-        43: 0,  # 'Г'
-        37: 0,  # 'Д'
-        44: 0,  # 'Е'
-        55: 0,  # 'Ж'
-        47: 0,  # 'З'
-        40: 0,  # 'И'
-        59: 0,  # 'Й'
-        33: 0,  # 'К'
-        46: 0,  # 'Л'
-        38: 0,  # 'М'
-        36: 0,  # 'Ð'
-        41: 0,  # 'О'
-        30: 0,  # 'П'
-        39: 0,  # 'Р'
-        28: 0,  # 'С'
-        34: 0,  # 'Т'
-        51: 0,  # 'У'
-        48: 0,  # 'Ф'
-        49: 0,  # 'Ð¥'
-        53: 0,  # 'Ц'
-        50: 0,  # 'Ч'
-        54: 0,  # 'Ш'
-        57: 0,  # 'Щ'
-        61: 0,  # 'Ъ'
-        60: 0,  # 'Ю'
-        56: 0,  # 'Я'
-        1: 3,  # 'а'
-        18: 1,  # 'б'
-        9: 2,  # 'в'
-        20: 1,  # 'г'
-        11: 1,  # 'д'
-        3: 3,  # 'е'
-        23: 0,  # 'ж'
-        15: 1,  # 'з'
-        2: 3,  # 'и'
-        26: 0,  # 'й'
-        12: 2,  # 'к'
-        10: 1,  # 'л'
-        14: 1,  # 'м'
-        6: 1,  # 'н'
-        4: 2,  # 'о'
-        13: 1,  # 'п'
-        7: 1,  # 'Ñ€'
-        8: 1,  # 'Ñ'
-        5: 1,  # 'Ñ‚'
-        19: 2,  # 'у'
-        29: 1,  # 'Ñ„'
-        25: 1,  # 'Ñ…'
-        22: 1,  # 'ц'
-        21: 1,  # 'ч'
-        27: 1,  # 'ш'
-        24: 1,  # 'щ'
-        17: 2,  # 'ÑŠ'
-        52: 1,  # 'ь'
-        42: 0,  # 'ÑŽ'
-        16: 2,  # 'Ñ'
-        58: 0,  # 'Ñ”'
-        62: 0,  # 'â„–'
-    },
-    21: {  # 'ч'
-        63: 1,  # 'e'
-        45: 0,  # '\xad'
-        31: 0,  # 'Ð'
-        32: 0,  # 'Б'
-        35: 0,  # 'Ð’'
-        43: 0,  # 'Г'
-        37: 0,  # 'Д'
-        44: 0,  # 'Е'
-        55: 0,  # 'Ж'
-        47: 0,  # 'З'
-        40: 0,  # 'И'
-        59: 0,  # 'Й'
-        33: 0,  # 'К'
-        46: 0,  # 'Л'
-        38: 0,  # 'М'
-        36: 0,  # 'Ð'
-        41: 0,  # 'О'
-        30: 0,  # 'П'
-        39: 0,  # 'Р'
-        28: 0,  # 'С'
-        34: 0,  # 'Т'
-        51: 0,  # 'У'
-        48: 0,  # 'Ф'
-        49: 0,  # 'Ð¥'
-        53: 0,  # 'Ц'
-        50: 0,  # 'Ч'
-        54: 0,  # 'Ш'
-        57: 0,  # 'Щ'
-        61: 0,  # 'Ъ'
-        60: 0,  # 'Ю'
-        56: 0,  # 'Я'
-        1: 3,  # 'а'
-        18: 1,  # 'б'
-        9: 3,  # 'в'
-        20: 1,  # 'г'
-        11: 0,  # 'д'
-        3: 3,  # 'е'
-        23: 1,  # 'ж'
-        15: 0,  # 'з'
-        2: 3,  # 'и'
-        26: 0,  # 'й'
-        12: 3,  # 'к'
-        10: 2,  # 'л'
-        14: 2,  # 'м'
-        6: 3,  # 'н'
-        4: 3,  # 'о'
-        13: 0,  # 'п'
-        7: 2,  # 'Ñ€'
-        8: 0,  # 'Ñ'
-        5: 2,  # 'Ñ‚'
-        19: 3,  # 'у'
-        29: 0,  # 'Ñ„'
-        25: 0,  # 'Ñ…'
-        22: 0,  # 'ц'
-        21: 0,  # 'ч'
-        27: 1,  # 'ш'
-        24: 0,  # 'щ'
-        17: 2,  # 'ÑŠ'
-        52: 0,  # 'ь'
-        42: 1,  # 'ÑŽ'
-        16: 0,  # 'Ñ'
-        58: 0,  # 'Ñ”'
-        62: 0,  # 'â„–'
-    },
-    27: {  # 'ш'
-        63: 1,  # 'e'
-        45: 0,  # '\xad'
-        31: 0,  # 'Ð'
-        32: 0,  # 'Б'
-        35: 0,  # 'Ð’'
-        43: 0,  # 'Г'
-        37: 0,  # 'Д'
-        44: 0,  # 'Е'
-        55: 0,  # 'Ж'
-        47: 0,  # 'З'
-        40: 0,  # 'И'
-        59: 0,  # 'Й'
-        33: 0,  # 'К'
-        46: 0,  # 'Л'
-        38: 0,  # 'М'
-        36: 0,  # 'Ð'
-        41: 0,  # 'О'
-        30: 0,  # 'П'
-        39: 0,  # 'Р'
-        28: 0,  # 'С'
-        34: 0,  # 'Т'
-        51: 0,  # 'У'
-        48: 0,  # 'Ф'
-        49: 0,  # 'Ð¥'
-        53: 0,  # 'Ц'
-        50: 0,  # 'Ч'
-        54: 0,  # 'Ш'
-        57: 0,  # 'Щ'
-        61: 0,  # 'Ъ'
-        60: 0,  # 'Ю'
-        56: 0,  # 'Я'
-        1: 3,  # 'а'
-        18: 0,  # 'б'
-        9: 2,  # 'в'
-        20: 0,  # 'г'
-        11: 1,  # 'д'
-        3: 3,  # 'е'
-        23: 0,  # 'ж'
-        15: 0,  # 'з'
-        2: 3,  # 'и'
-        26: 0,  # 'й'
-        12: 3,  # 'к'
-        10: 2,  # 'л'
-        14: 1,  # 'м'
-        6: 3,  # 'н'
-        4: 2,  # 'о'
-        13: 2,  # 'п'
-        7: 1,  # 'Ñ€'
-        8: 0,  # 'Ñ'
-        5: 1,  # 'Ñ‚'
-        19: 2,  # 'у'
-        29: 1,  # 'Ñ„'
-        25: 0,  # 'Ñ…'
-        22: 0,  # 'ц'
-        21: 1,  # 'ч'
-        27: 0,  # 'ш'
-        24: 0,  # 'щ'
-        17: 2,  # 'ÑŠ'
-        52: 1,  # 'ь'
-        42: 1,  # 'ÑŽ'
-        16: 0,  # 'Ñ'
-        58: 0,  # 'Ñ”'
-        62: 0,  # 'â„–'
-    },
-    24: {  # 'щ'
-        63: 1,  # 'e'
-        45: 0,  # '\xad'
-        31: 0,  # 'Ð'
-        32: 0,  # 'Б'
-        35: 0,  # 'Ð’'
-        43: 0,  # 'Г'
-        37: 0,  # 'Д'
-        44: 0,  # 'Е'
-        55: 0,  # 'Ж'
-        47: 0,  # 'З'
-        40: 0,  # 'И'
-        59: 0,  # 'Й'
-        33: 0,  # 'К'
-        46: 0,  # 'Л'
-        38: 0,  # 'М'
-        36: 0,  # 'Ð'
-        41: 0,  # 'О'
-        30: 0,  # 'П'
-        39: 0,  # 'Р'
-        28: 0,  # 'С'
-        34: 0,  # 'Т'
-        51: 0,  # 'У'
-        48: 0,  # 'Ф'
-        49: 0,  # 'Ð¥'
-        53: 0,  # 'Ц'
-        50: 0,  # 'Ч'
-        54: 0,  # 'Ш'
-        57: 0,  # 'Щ'
-        61: 0,  # 'Ъ'
-        60: 0,  # 'Ю'
-        56: 0,  # 'Я'
-        1: 3,  # 'а'
-        18: 0,  # 'б'
-        9: 1,  # 'в'
-        20: 0,  # 'г'
-        11: 0,  # 'д'
-        3: 3,  # 'е'
-        23: 0,  # 'ж'
-        15: 0,  # 'з'
-        2: 3,  # 'и'
-        26: 0,  # 'й'
-        12: 1,  # 'к'
-        10: 0,  # 'л'
-        14: 0,  # 'м'
-        6: 2,  # 'н'
-        4: 3,  # 'о'
-        13: 0,  # 'п'
-        7: 1,  # 'Ñ€'
-        8: 0,  # 'Ñ'
-        5: 2,  # 'Ñ‚'
-        19: 3,  # 'у'
-        29: 0,  # 'Ñ„'
-        25: 0,  # 'Ñ…'
-        22: 1,  # 'ц'
-        21: 0,  # 'ч'
-        27: 0,  # 'ш'
-        24: 0,  # 'щ'
-        17: 1,  # 'ÑŠ'
-        52: 0,  # 'ь'
-        42: 0,  # 'ÑŽ'
-        16: 2,  # 'Ñ'
-        58: 0,  # 'Ñ”'
-        62: 0,  # 'â„–'
-    },
-    17: {  # 'ÑŠ'
-        63: 0,  # 'e'
-        45: 0,  # '\xad'
-        31: 0,  # 'Ð'
-        32: 0,  # 'Б'
-        35: 0,  # 'Ð’'
-        43: 0,  # 'Г'
-        37: 0,  # 'Д'
-        44: 0,  # 'Е'
-        55: 0,  # 'Ж'
-        47: 0,  # 'З'
-        40: 0,  # 'И'
-        59: 0,  # 'Й'
-        33: 0,  # 'К'
-        46: 0,  # 'Л'
-        38: 0,  # 'М'
-        36: 0,  # 'Ð'
-        41: 0,  # 'О'
-        30: 0,  # 'П'
-        39: 0,  # 'Р'
-        28: 0,  # 'С'
-        34: 0,  # 'Т'
-        51: 0,  # 'У'
-        48: 0,  # 'Ф'
-        49: 0,  # 'Ð¥'
-        53: 0,  # 'Ц'
-        50: 0,  # 'Ч'
-        54: 0,  # 'Ш'
-        57: 0,  # 'Щ'
-        61: 0,  # 'Ъ'
-        60: 0,  # 'Ю'
-        56: 0,  # 'Я'
-        1: 1,  # 'а'
-        18: 3,  # 'б'
-        9: 3,  # 'в'
-        20: 3,  # 'г'
-        11: 3,  # 'д'
-        3: 2,  # 'е'
-        23: 3,  # 'ж'
-        15: 3,  # 'з'
-        2: 1,  # 'и'
-        26: 2,  # 'й'
-        12: 3,  # 'к'
-        10: 3,  # 'л'
-        14: 3,  # 'м'
-        6: 3,  # 'н'
-        4: 3,  # 'о'
-        13: 3,  # 'п'
-        7: 3,  # 'Ñ€'
-        8: 3,  # 'Ñ'
-        5: 3,  # 'Ñ‚'
-        19: 1,  # 'у'
-        29: 1,  # 'Ñ„'
-        25: 2,  # 'Ñ…'
-        22: 2,  # 'ц'
-        21: 3,  # 'ч'
-        27: 2,  # 'ш'
-        24: 3,  # 'щ'
-        17: 0,  # 'ÑŠ'
-        52: 0,  # 'ь'
-        42: 2,  # 'ÑŽ'
-        16: 0,  # 'Ñ'
-        58: 0,  # 'Ñ”'
-        62: 0,  # 'â„–'
-    },
-    52: {  # 'ь'
-        63: 0,  # 'e'
-        45: 0,  # '\xad'
-        31: 0,  # 'Ð'
-        32: 0,  # 'Б'
-        35: 0,  # 'Ð’'
-        43: 0,  # 'Г'
-        37: 0,  # 'Д'
-        44: 0,  # 'Е'
-        55: 0,  # 'Ж'
-        47: 0,  # 'З'
-        40: 0,  # 'И'
-        59: 0,  # 'Й'
-        33: 0,  # 'К'
-        46: 0,  # 'Л'
-        38: 0,  # 'М'
-        36: 0,  # 'Ð'
-        41: 0,  # 'О'
-        30: 0,  # 'П'
-        39: 0,  # 'Р'
-        28: 0,  # 'С'
-        34: 0,  # 'Т'
-        51: 0,  # 'У'
-        48: 0,  # 'Ф'
-        49: 0,  # 'Ð¥'
-        53: 0,  # 'Ц'
-        50: 0,  # 'Ч'
-        54: 0,  # 'Ш'
-        57: 0,  # 'Щ'
-        61: 0,  # 'Ъ'
-        60: 0,  # 'Ю'
-        56: 0,  # 'Я'
-        1: 0,  # 'а'
-        18: 0,  # 'б'
-        9: 0,  # 'в'
-        20: 0,  # 'г'
-        11: 0,  # 'д'
-        3: 1,  # 'е'
-        23: 0,  # 'ж'
-        15: 0,  # 'з'
-        2: 0,  # 'и'
-        26: 0,  # 'й'
-        12: 1,  # 'к'
-        10: 0,  # 'л'
-        14: 0,  # 'м'
-        6: 1,  # 'н'
-        4: 3,  # 'о'
-        13: 0,  # 'п'
-        7: 0,  # 'Ñ€'
-        8: 0,  # 'Ñ'
-        5: 1,  # 'Ñ‚'
-        19: 0,  # 'у'
-        29: 0,  # 'Ñ„'
-        25: 0,  # 'Ñ…'
-        22: 1,  # 'ц'
-        21: 0,  # 'ч'
-        27: 0,  # 'ш'
-        24: 0,  # 'щ'
-        17: 0,  # 'ÑŠ'
-        52: 0,  # 'ь'
-        42: 1,  # 'ÑŽ'
-        16: 0,  # 'Ñ'
-        58: 0,  # 'Ñ”'
-        62: 0,  # 'â„–'
-    },
-    42: {  # 'ÑŽ'
-        63: 0,  # 'e'
-        45: 0,  # '\xad'
-        31: 0,  # 'Ð'
-        32: 0,  # 'Б'
-        35: 0,  # 'Ð’'
-        43: 0,  # 'Г'
-        37: 0,  # 'Д'
-        44: 0,  # 'Е'
-        55: 0,  # 'Ж'
-        47: 0,  # 'З'
-        40: 0,  # 'И'
-        59: 0,  # 'Й'
-        33: 0,  # 'К'
-        46: 0,  # 'Л'
-        38: 0,  # 'М'
-        36: 0,  # 'Ð'
-        41: 0,  # 'О'
-        30: 0,  # 'П'
-        39: 0,  # 'Р'
-        28: 0,  # 'С'
-        34: 0,  # 'Т'
-        51: 0,  # 'У'
-        48: 0,  # 'Ф'
-        49: 0,  # 'Ð¥'
-        53: 0,  # 'Ц'
-        50: 0,  # 'Ч'
-        54: 0,  # 'Ш'
-        57: 0,  # 'Щ'
-        61: 0,  # 'Ъ'
-        60: 0,  # 'Ю'
-        56: 0,  # 'Я'
-        1: 1,  # 'а'
-        18: 2,  # 'б'
-        9: 1,  # 'в'
-        20: 2,  # 'г'
-        11: 2,  # 'д'
-        3: 1,  # 'е'
-        23: 2,  # 'ж'
-        15: 2,  # 'з'
-        2: 1,  # 'и'
-        26: 1,  # 'й'
-        12: 2,  # 'к'
-        10: 2,  # 'л'
-        14: 2,  # 'м'
-        6: 2,  # 'н'
-        4: 1,  # 'о'
-        13: 1,  # 'п'
-        7: 2,  # 'Ñ€'
-        8: 2,  # 'Ñ'
-        5: 2,  # 'Ñ‚'
-        19: 1,  # 'у'
-        29: 1,  # 'Ñ„'
-        25: 1,  # 'Ñ…'
-        22: 2,  # 'ц'
-        21: 3,  # 'ч'
-        27: 1,  # 'ш'
-        24: 1,  # 'щ'
-        17: 1,  # 'ÑŠ'
-        52: 0,  # 'ь'
-        42: 0,  # 'ÑŽ'
-        16: 1,  # 'Ñ'
-        58: 0,  # 'Ñ”'
-        62: 0,  # 'â„–'
-    },
-    16: {  # 'Ñ'
-        63: 0,  # 'e'
-        45: 1,  # '\xad'
-        31: 0,  # 'Ð'
-        32: 0,  # 'Б'
-        35: 0,  # 'Ð’'
-        43: 0,  # 'Г'
-        37: 0,  # 'Д'
-        44: 0,  # 'Е'
-        55: 0,  # 'Ж'
-        47: 0,  # 'З'
-        40: 0,  # 'И'
-        59: 0,  # 'Й'
-        33: 0,  # 'К'
-        46: 0,  # 'Л'
-        38: 0,  # 'М'
-        36: 0,  # 'Ð'
-        41: 0,  # 'О'
-        30: 0,  # 'П'
-        39: 0,  # 'Р'
-        28: 0,  # 'С'
-        34: 0,  # 'Т'
-        51: 0,  # 'У'
-        48: 0,  # 'Ф'
-        49: 0,  # 'Ð¥'
-        53: 0,  # 'Ц'
-        50: 0,  # 'Ч'
-        54: 0,  # 'Ш'
-        57: 0,  # 'Щ'
-        61: 0,  # 'Ъ'
-        60: 0,  # 'Ю'
-        56: 0,  # 'Я'
-        1: 0,  # 'а'
-        18: 3,  # 'б'
-        9: 3,  # 'в'
-        20: 2,  # 'г'
-        11: 3,  # 'д'
-        3: 2,  # 'е'
-        23: 1,  # 'ж'
-        15: 2,  # 'з'
-        2: 1,  # 'и'
-        26: 2,  # 'й'
-        12: 3,  # 'к'
-        10: 3,  # 'л'
-        14: 3,  # 'м'
-        6: 3,  # 'н'
-        4: 1,  # 'о'
-        13: 2,  # 'п'
-        7: 2,  # 'Ñ€'
-        8: 3,  # 'Ñ'
-        5: 3,  # 'Ñ‚'
-        19: 1,  # 'у'
-        29: 1,  # 'Ñ„'
-        25: 3,  # 'Ñ…'
-        22: 2,  # 'ц'
-        21: 1,  # 'ч'
-        27: 1,  # 'ш'
-        24: 2,  # 'щ'
-        17: 0,  # 'ÑŠ'
-        52: 0,  # 'ь'
-        42: 0,  # 'ÑŽ'
-        16: 1,  # 'Ñ'
-        58: 0,  # 'Ñ”'
-        62: 0,  # 'â„–'
-    },
-    58: {  # 'Ñ”'
-        63: 0,  # 'e'
-        45: 0,  # '\xad'
-        31: 0,  # 'Ð'
-        32: 0,  # 'Б'
-        35: 0,  # 'Ð’'
-        43: 0,  # 'Г'
-        37: 0,  # 'Д'
-        44: 0,  # 'Е'
-        55: 0,  # 'Ж'
-        47: 0,  # 'З'
-        40: 0,  # 'И'
-        59: 0,  # 'Й'
-        33: 0,  # 'К'
-        46: 0,  # 'Л'
-        38: 0,  # 'М'
-        36: 0,  # 'Ð'
-        41: 0,  # 'О'
-        30: 0,  # 'П'
-        39: 0,  # 'Р'
-        28: 0,  # 'С'
-        34: 0,  # 'Т'
-        51: 0,  # 'У'
-        48: 0,  # 'Ф'
-        49: 0,  # 'Ð¥'
-        53: 0,  # 'Ц'
-        50: 0,  # 'Ч'
-        54: 0,  # 'Ш'
-        57: 0,  # 'Щ'
-        61: 0,  # 'Ъ'
-        60: 0,  # 'Ю'
-        56: 0,  # 'Я'
-        1: 0,  # 'а'
-        18: 0,  # 'б'
-        9: 0,  # 'в'
-        20: 0,  # 'г'
-        11: 0,  # 'д'
-        3: 0,  # 'е'
-        23: 0,  # 'ж'
-        15: 0,  # 'з'
-        2: 0,  # 'и'
-        26: 0,  # 'й'
-        12: 0,  # 'к'
-        10: 0,  # 'л'
-        14: 0,  # 'м'
-        6: 0,  # 'н'
-        4: 0,  # 'о'
-        13: 0,  # 'п'
-        7: 0,  # 'Ñ€'
-        8: 0,  # 'Ñ'
-        5: 0,  # 'Ñ‚'
-        19: 0,  # 'у'
-        29: 0,  # 'Ñ„'
-        25: 0,  # 'Ñ…'
-        22: 0,  # 'ц'
-        21: 0,  # 'ч'
-        27: 0,  # 'ш'
-        24: 0,  # 'щ'
-        17: 0,  # 'ÑŠ'
-        52: 0,  # 'ь'
-        42: 0,  # 'ÑŽ'
-        16: 0,  # 'Ñ'
-        58: 0,  # 'Ñ”'
-        62: 0,  # 'â„–'
-    },
-    62: {  # 'â„–'
-        63: 0,  # 'e'
-        45: 0,  # '\xad'
-        31: 0,  # 'Ð'
-        32: 0,  # 'Б'
-        35: 0,  # 'Ð’'
-        43: 0,  # 'Г'
-        37: 0,  # 'Д'
-        44: 0,  # 'Е'
-        55: 0,  # 'Ж'
-        47: 0,  # 'З'
-        40: 0,  # 'И'
-        59: 0,  # 'Й'
-        33: 0,  # 'К'
-        46: 0,  # 'Л'
-        38: 0,  # 'М'
-        36: 0,  # 'Ð'
-        41: 0,  # 'О'
-        30: 0,  # 'П'
-        39: 0,  # 'Р'
-        28: 0,  # 'С'
-        34: 0,  # 'Т'
-        51: 0,  # 'У'
-        48: 0,  # 'Ф'
-        49: 0,  # 'Ð¥'
-        53: 0,  # 'Ц'
-        50: 0,  # 'Ч'
-        54: 0,  # 'Ш'
-        57: 0,  # 'Щ'
-        61: 0,  # 'Ъ'
-        60: 0,  # 'Ю'
-        56: 0,  # 'Я'
-        1: 0,  # 'а'
-        18: 0,  # 'б'
-        9: 0,  # 'в'
-        20: 0,  # 'г'
-        11: 0,  # 'д'
-        3: 0,  # 'е'
-        23: 0,  # 'ж'
-        15: 0,  # 'з'
-        2: 0,  # 'и'
-        26: 0,  # 'й'
-        12: 0,  # 'к'
-        10: 0,  # 'л'
-        14: 0,  # 'м'
-        6: 0,  # 'н'
-        4: 0,  # 'о'
-        13: 0,  # 'п'
-        7: 0,  # 'Ñ€'
-        8: 0,  # 'Ñ'
-        5: 0,  # 'Ñ‚'
-        19: 0,  # 'у'
-        29: 0,  # 'Ñ„'
-        25: 0,  # 'Ñ…'
-        22: 0,  # 'ц'
-        21: 0,  # 'ч'
-        27: 0,  # 'ш'
-        24: 0,  # 'щ'
-        17: 0,  # 'ÑŠ'
-        52: 0,  # 'ь'
-        42: 0,  # 'ÑŽ'
-        16: 0,  # 'Ñ'
-        58: 0,  # 'Ñ”'
-        62: 0,  # 'â„–'
-    },
-}
-
-# 255: Undefined characters that did not exist in training text
-# 254: Carriage/Return
-# 253: symbol (punctuation) that does not belong to word
-# 252: 0 - 9
-# 251: Control characters
-
-# Character Mapping Table(s):
-ISO_8859_5_BULGARIAN_CHAR_TO_ORDER = {
-     0: 255,  # '\x00'
-     1: 255,  # '\x01'
-     2: 255,  # '\x02'
-     3: 255,  # '\x03'
-     4: 255,  # '\x04'
-     5: 255,  # '\x05'
-     6: 255,  # '\x06'
-     7: 255,  # '\x07'
-     8: 255,  # '\x08'
-     9: 255,  # '\t'
-     10: 254,  # '\n'
-     11: 255,  # '\x0b'
-     12: 255,  # '\x0c'
-     13: 254,  # '\r'
-     14: 255,  # '\x0e'
-     15: 255,  # '\x0f'
-     16: 255,  # '\x10'
-     17: 255,  # '\x11'
-     18: 255,  # '\x12'
-     19: 255,  # '\x13'
-     20: 255,  # '\x14'
-     21: 255,  # '\x15'
-     22: 255,  # '\x16'
-     23: 255,  # '\x17'
-     24: 255,  # '\x18'
-     25: 255,  # '\x19'
-     26: 255,  # '\x1a'
-     27: 255,  # '\x1b'
-     28: 255,  # '\x1c'
-     29: 255,  # '\x1d'
-     30: 255,  # '\x1e'
-     31: 255,  # '\x1f'
-     32: 253,  # ' '
-     33: 253,  # '!'
-     34: 253,  # '"'
-     35: 253,  # '#'
-     36: 253,  # '$'
-     37: 253,  # '%'
-     38: 253,  # '&'
-     39: 253,  # "'"
-     40: 253,  # '('
-     41: 253,  # ')'
-     42: 253,  # '*'
-     43: 253,  # '+'
-     44: 253,  # ','
-     45: 253,  # '-'
-     46: 253,  # '.'
-     47: 253,  # '/'
-     48: 252,  # '0'
-     49: 252,  # '1'
-     50: 252,  # '2'
-     51: 252,  # '3'
-     52: 252,  # '4'
-     53: 252,  # '5'
-     54: 252,  # '6'
-     55: 252,  # '7'
-     56: 252,  # '8'
-     57: 252,  # '9'
-     58: 253,  # ':'
-     59: 253,  # ';'
-     60: 253,  # '<'
-     61: 253,  # '='
-     62: 253,  # '>'
-     63: 253,  # '?'
-     64: 253,  # '@'
-     65: 77,  # 'A'
-     66: 90,  # 'B'
-     67: 99,  # 'C'
-     68: 100,  # 'D'
-     69: 72,  # 'E'
-     70: 109,  # 'F'
-     71: 107,  # 'G'
-     72: 101,  # 'H'
-     73: 79,  # 'I'
-     74: 185,  # 'J'
-     75: 81,  # 'K'
-     76: 102,  # 'L'
-     77: 76,  # 'M'
-     78: 94,  # 'N'
-     79: 82,  # 'O'
-     80: 110,  # 'P'
-     81: 186,  # 'Q'
-     82: 108,  # 'R'
-     83: 91,  # 'S'
-     84: 74,  # 'T'
-     85: 119,  # 'U'
-     86: 84,  # 'V'
-     87: 96,  # 'W'
-     88: 111,  # 'X'
-     89: 187,  # 'Y'
-     90: 115,  # 'Z'
-     91: 253,  # '['
-     92: 253,  # '\\'
-     93: 253,  # ']'
-     94: 253,  # '^'
-     95: 253,  # '_'
-     96: 253,  # '`'
-     97: 65,  # 'a'
-     98: 69,  # 'b'
-     99: 70,  # 'c'
-     100: 66,  # 'd'
-     101: 63,  # 'e'
-     102: 68,  # 'f'
-     103: 112,  # 'g'
-     104: 103,  # 'h'
-     105: 92,  # 'i'
-     106: 194,  # 'j'
-     107: 104,  # 'k'
-     108: 95,  # 'l'
-     109: 86,  # 'm'
-     110: 87,  # 'n'
-     111: 71,  # 'o'
-     112: 116,  # 'p'
-     113: 195,  # 'q'
-     114: 85,  # 'r'
-     115: 93,  # 's'
-     116: 97,  # 't'
-     117: 113,  # 'u'
-     118: 196,  # 'v'
-     119: 197,  # 'w'
-     120: 198,  # 'x'
-     121: 199,  # 'y'
-     122: 200,  # 'z'
-     123: 253,  # '{'
-     124: 253,  # '|'
-     125: 253,  # '}'
-     126: 253,  # '~'
-     127: 253,  # '\x7f'
-     128: 194,  # '\x80'
-     129: 195,  # '\x81'
-     130: 196,  # '\x82'
-     131: 197,  # '\x83'
-     132: 198,  # '\x84'
-     133: 199,  # '\x85'
-     134: 200,  # '\x86'
-     135: 201,  # '\x87'
-     136: 202,  # '\x88'
-     137: 203,  # '\x89'
-     138: 204,  # '\x8a'
-     139: 205,  # '\x8b'
-     140: 206,  # '\x8c'
-     141: 207,  # '\x8d'
-     142: 208,  # '\x8e'
-     143: 209,  # '\x8f'
-     144: 210,  # '\x90'
-     145: 211,  # '\x91'
-     146: 212,  # '\x92'
-     147: 213,  # '\x93'
-     148: 214,  # '\x94'
-     149: 215,  # '\x95'
-     150: 216,  # '\x96'
-     151: 217,  # '\x97'
-     152: 218,  # '\x98'
-     153: 219,  # '\x99'
-     154: 220,  # '\x9a'
-     155: 221,  # '\x9b'
-     156: 222,  # '\x9c'
-     157: 223,  # '\x9d'
-     158: 224,  # '\x9e'
-     159: 225,  # '\x9f'
-     160: 81,  # '\xa0'
-     161: 226,  # 'Ð'
-     162: 227,  # 'Ђ'
-     163: 228,  # 'Ѓ'
-     164: 229,  # 'Є'
-     165: 230,  # 'Ð…'
-     166: 105,  # 'І'
-     167: 231,  # 'Ї'
-     168: 232,  # 'Ј'
-     169: 233,  # 'Љ'
-     170: 234,  # 'Њ'
-     171: 235,  # 'Ћ'
-     172: 236,  # 'Ќ'
-     173: 45,  # '\xad'
-     174: 237,  # 'ÐŽ'
-     175: 238,  # 'Ð'
-     176: 31,  # 'Ð'
-     177: 32,  # 'Б'
-     178: 35,  # 'Ð’'
-     179: 43,  # 'Г'
-     180: 37,  # 'Д'
-     181: 44,  # 'Е'
-     182: 55,  # 'Ж'
-     183: 47,  # 'З'
-     184: 40,  # 'И'
-     185: 59,  # 'Й'
-     186: 33,  # 'К'
-     187: 46,  # 'Л'
-     188: 38,  # 'М'
-     189: 36,  # 'Ð'
-     190: 41,  # 'О'
-     191: 30,  # 'П'
-     192: 39,  # 'Р'
-     193: 28,  # 'С'
-     194: 34,  # 'Т'
-     195: 51,  # 'У'
-     196: 48,  # 'Ф'
-     197: 49,  # 'Ð¥'
-     198: 53,  # 'Ц'
-     199: 50,  # 'Ч'
-     200: 54,  # 'Ш'
-     201: 57,  # 'Щ'
-     202: 61,  # 'Ъ'
-     203: 239,  # 'Ы'
-     204: 67,  # 'Ь'
-     205: 240,  # 'Э'
-     206: 60,  # 'Ю'
-     207: 56,  # 'Я'
-     208: 1,  # 'а'
-     209: 18,  # 'б'
-     210: 9,  # 'в'
-     211: 20,  # 'г'
-     212: 11,  # 'д'
-     213: 3,  # 'е'
-     214: 23,  # 'ж'
-     215: 15,  # 'з'
-     216: 2,  # 'и'
-     217: 26,  # 'й'
-     218: 12,  # 'к'
-     219: 10,  # 'л'
-     220: 14,  # 'м'
-     221: 6,  # 'н'
-     222: 4,  # 'о'
-     223: 13,  # 'п'
-     224: 7,  # 'Ñ€'
-     225: 8,  # 'Ñ'
-     226: 5,  # 'Ñ‚'
-     227: 19,  # 'у'
-     228: 29,  # 'Ñ„'
-     229: 25,  # 'Ñ…'
-     230: 22,  # 'ц'
-     231: 21,  # 'ч'
-     232: 27,  # 'ш'
-     233: 24,  # 'щ'
-     234: 17,  # 'ÑŠ'
-     235: 75,  # 'Ñ‹'
-     236: 52,  # 'ь'
-     237: 241,  # 'Ñ'
-     238: 42,  # 'ÑŽ'
-     239: 16,  # 'Ñ'
-     240: 62,  # 'â„–'
-     241: 242,  # 'Ñ‘'
-     242: 243,  # 'Ñ’'
-     243: 244,  # 'Ñ“'
-     244: 58,  # 'Ñ”'
-     245: 245,  # 'Ñ•'
-     246: 98,  # 'Ñ–'
-     247: 246,  # 'Ñ—'
-     248: 247,  # 'ј'
-     249: 248,  # 'Ñ™'
-     250: 249,  # 'Ñš'
-     251: 250,  # 'Ñ›'
-     252: 251,  # 'ќ'
-     253: 91,  # '§'
-     254: 252,  # 'Ñž'
-     255: 253,  # 'ÑŸ'
-}
-
-ISO_8859_5_BULGARIAN_MODEL = SingleByteCharSetModel(charset_name='ISO-8859-5',
-                                                    language='Bulgarian',
-                                                    char_to_order_map=ISO_8859_5_BULGARIAN_CHAR_TO_ORDER,
-                                                    language_model=BULGARIAN_LANG_MODEL,
-                                                    typical_positive_ratio=0.969392,
-                                                    keep_ascii_letters=False,
-                                                    alphabet='ÐБВГДЕЖЗИЙКЛМÐОПРСТУФХЦЧШЩЪЬЮЯабвгдежзийклмнопрÑтуфхцчшщъьюÑ')
-
-WINDOWS_1251_BULGARIAN_CHAR_TO_ORDER = {
-     0: 255,  # '\x00'
-     1: 255,  # '\x01'
-     2: 255,  # '\x02'
-     3: 255,  # '\x03'
-     4: 255,  # '\x04'
-     5: 255,  # '\x05'
-     6: 255,  # '\x06'
-     7: 255,  # '\x07'
-     8: 255,  # '\x08'
-     9: 255,  # '\t'
-     10: 254,  # '\n'
-     11: 255,  # '\x0b'
-     12: 255,  # '\x0c'
-     13: 254,  # '\r'
-     14: 255,  # '\x0e'
-     15: 255,  # '\x0f'
-     16: 255,  # '\x10'
-     17: 255,  # '\x11'
-     18: 255,  # '\x12'
-     19: 255,  # '\x13'
-     20: 255,  # '\x14'
-     21: 255,  # '\x15'
-     22: 255,  # '\x16'
-     23: 255,  # '\x17'
-     24: 255,  # '\x18'
-     25: 255,  # '\x19'
-     26: 255,  # '\x1a'
-     27: 255,  # '\x1b'
-     28: 255,  # '\x1c'
-     29: 255,  # '\x1d'
-     30: 255,  # '\x1e'
-     31: 255,  # '\x1f'
-     32: 253,  # ' '
-     33: 253,  # '!'
-     34: 253,  # '"'
-     35: 253,  # '#'
-     36: 253,  # '$'
-     37: 253,  # '%'
-     38: 253,  # '&'
-     39: 253,  # "'"
-     40: 253,  # '('
-     41: 253,  # ')'
-     42: 253,  # '*'
-     43: 253,  # '+'
-     44: 253,  # ','
-     45: 253,  # '-'
-     46: 253,  # '.'
-     47: 253,  # '/'
-     48: 252,  # '0'
-     49: 252,  # '1'
-     50: 252,  # '2'
-     51: 252,  # '3'
-     52: 252,  # '4'
-     53: 252,  # '5'
-     54: 252,  # '6'
-     55: 252,  # '7'
-     56: 252,  # '8'
-     57: 252,  # '9'
-     58: 253,  # ':'
-     59: 253,  # ';'
-     60: 253,  # '<'
-     61: 253,  # '='
-     62: 253,  # '>'
-     63: 253,  # '?'
-     64: 253,  # '@'
-     65: 77,  # 'A'
-     66: 90,  # 'B'
-     67: 99,  # 'C'
-     68: 100,  # 'D'
-     69: 72,  # 'E'
-     70: 109,  # 'F'
-     71: 107,  # 'G'
-     72: 101,  # 'H'
-     73: 79,  # 'I'
-     74: 185,  # 'J'
-     75: 81,  # 'K'
-     76: 102,  # 'L'
-     77: 76,  # 'M'
-     78: 94,  # 'N'
-     79: 82,  # 'O'
-     80: 110,  # 'P'
-     81: 186,  # 'Q'
-     82: 108,  # 'R'
-     83: 91,  # 'S'
-     84: 74,  # 'T'
-     85: 119,  # 'U'
-     86: 84,  # 'V'
-     87: 96,  # 'W'
-     88: 111,  # 'X'
-     89: 187,  # 'Y'
-     90: 115,  # 'Z'
-     91: 253,  # '['
-     92: 253,  # '\\'
-     93: 253,  # ']'
-     94: 253,  # '^'
-     95: 253,  # '_'
-     96: 253,  # '`'
-     97: 65,  # 'a'
-     98: 69,  # 'b'
-     99: 70,  # 'c'
-     100: 66,  # 'd'
-     101: 63,  # 'e'
-     102: 68,  # 'f'
-     103: 112,  # 'g'
-     104: 103,  # 'h'
-     105: 92,  # 'i'
-     106: 194,  # 'j'
-     107: 104,  # 'k'
-     108: 95,  # 'l'
-     109: 86,  # 'm'
-     110: 87,  # 'n'
-     111: 71,  # 'o'
-     112: 116,  # 'p'
-     113: 195,  # 'q'
-     114: 85,  # 'r'
-     115: 93,  # 's'
-     116: 97,  # 't'
-     117: 113,  # 'u'
-     118: 196,  # 'v'
-     119: 197,  # 'w'
-     120: 198,  # 'x'
-     121: 199,  # 'y'
-     122: 200,  # 'z'
-     123: 253,  # '{'
-     124: 253,  # '|'
-     125: 253,  # '}'
-     126: 253,  # '~'
-     127: 253,  # '\x7f'
-     128: 206,  # 'Ђ'
-     129: 207,  # 'Ѓ'
-     130: 208,  # '‚'
-     131: 209,  # 'Ñ“'
-     132: 210,  # '„'
-     133: 211,  # '…'
-     134: 212,  # '†'
-     135: 213,  # '‡'
-     136: 120,  # '€'
-     137: 214,  # '‰'
-     138: 215,  # 'Љ'
-     139: 216,  # '‹'
-     140: 217,  # 'Њ'
-     141: 218,  # 'Ќ'
-     142: 219,  # 'Ћ'
-     143: 220,  # 'Ð'
-     144: 221,  # 'Ñ’'
-     145: 78,  # '‘'
-     146: 64,  # '’'
-     147: 83,  # '“'
-     148: 121,  # 'â€'
-     149: 98,  # '•'
-     150: 117,  # '–'
-     151: 105,  # '—'
-     152: 222,  # None
-     153: 223,  # 'â„¢'
-     154: 224,  # 'Ñ™'
-     155: 225,  # '›'
-     156: 226,  # 'Ñš'
-     157: 227,  # 'ќ'
-     158: 228,  # 'Ñ›'
-     159: 229,  # 'ÑŸ'
-     160: 88,  # '\xa0'
-     161: 230,  # 'ÐŽ'
-     162: 231,  # 'Ñž'
-     163: 232,  # 'Ј'
-     164: 233,  # '¤'
-     165: 122,  # 'Ò'
-     166: 89,  # '¦'
-     167: 106,  # '§'
-     168: 234,  # 'Ð'
-     169: 235,  # '©'
-     170: 236,  # 'Є'
-     171: 237,  # '«'
-     172: 238,  # '¬'
-     173: 45,  # '\xad'
-     174: 239,  # '®'
-     175: 240,  # 'Ї'
-     176: 73,  # '°'
-     177: 80,  # '±'
-     178: 118,  # 'І'
-     179: 114,  # 'Ñ–'
-     180: 241,  # 'Ò‘'
-     181: 242,  # 'µ'
-     182: 243,  # '¶'
-     183: 244,  # '·'
-     184: 245,  # 'Ñ‘'
-     185: 62,  # 'â„–'
-     186: 58,  # 'Ñ”'
-     187: 246,  # '»'
-     188: 247,  # 'ј'
-     189: 248,  # 'Ð…'
-     190: 249,  # 'Ñ•'
-     191: 250,  # 'Ñ—'
-     192: 31,  # 'Ð'
-     193: 32,  # 'Б'
-     194: 35,  # 'Ð’'
-     195: 43,  # 'Г'
-     196: 37,  # 'Д'
-     197: 44,  # 'Е'
-     198: 55,  # 'Ж'
-     199: 47,  # 'З'
-     200: 40,  # 'И'
-     201: 59,  # 'Й'
-     202: 33,  # 'К'
-     203: 46,  # 'Л'
-     204: 38,  # 'М'
-     205: 36,  # 'Ð'
-     206: 41,  # 'О'
-     207: 30,  # 'П'
-     208: 39,  # 'Р'
-     209: 28,  # 'С'
-     210: 34,  # 'Т'
-     211: 51,  # 'У'
-     212: 48,  # 'Ф'
-     213: 49,  # 'Ð¥'
-     214: 53,  # 'Ц'
-     215: 50,  # 'Ч'
-     216: 54,  # 'Ш'
-     217: 57,  # 'Щ'
-     218: 61,  # 'Ъ'
-     219: 251,  # 'Ы'
-     220: 67,  # 'Ь'
-     221: 252,  # 'Э'
-     222: 60,  # 'Ю'
-     223: 56,  # 'Я'
-     224: 1,  # 'а'
-     225: 18,  # 'б'
-     226: 9,  # 'в'
-     227: 20,  # 'г'
-     228: 11,  # 'д'
-     229: 3,  # 'е'
-     230: 23,  # 'ж'
-     231: 15,  # 'з'
-     232: 2,  # 'и'
-     233: 26,  # 'й'
-     234: 12,  # 'к'
-     235: 10,  # 'л'
-     236: 14,  # 'м'
-     237: 6,  # 'н'
-     238: 4,  # 'о'
-     239: 13,  # 'п'
-     240: 7,  # 'Ñ€'
-     241: 8,  # 'Ñ'
-     242: 5,  # 'Ñ‚'
-     243: 19,  # 'у'
-     244: 29,  # 'Ñ„'
-     245: 25,  # 'Ñ…'
-     246: 22,  # 'ц'
-     247: 21,  # 'ч'
-     248: 27,  # 'ш'
-     249: 24,  # 'щ'
-     250: 17,  # 'ÑŠ'
-     251: 75,  # 'Ñ‹'
-     252: 52,  # 'ь'
-     253: 253,  # 'Ñ'
-     254: 42,  # 'ÑŽ'
-     255: 16,  # 'Ñ'
-}
-
-WINDOWS_1251_BULGARIAN_MODEL = SingleByteCharSetModel(charset_name='windows-1251',
-                                                      language='Bulgarian',
-                                                      char_to_order_map=WINDOWS_1251_BULGARIAN_CHAR_TO_ORDER,
-                                                      language_model=BULGARIAN_LANG_MODEL,
-                                                      typical_positive_ratio=0.969392,
-                                                      keep_ascii_letters=False,
-                                                      alphabet='ÐБВГДЕЖЗИЙКЛМÐОПРСТУФХЦЧШЩЪЬЮЯабвгдежзийклмнопрÑтуфхцчшщъьюÑ')
-
diff --git a/lib/sub_repos/chardet/chardet/langgreekmodel.py b/lib/sub_repos/chardet/chardet/langgreekmodel.py
deleted file mode 100644
index 02b94de65..000000000
--- a/lib/sub_repos/chardet/chardet/langgreekmodel.py
+++ /dev/null
@@ -1,4398 +0,0 @@
-#!/usr/bin/env python
-# -*- coding: utf-8 -*-
-
-from chardet.sbcharsetprober import SingleByteCharSetModel
-
-
-# 3: Positive
-# 2: Likely
-# 1: Unlikely
-# 0: Negative
-
-GREEK_LANG_MODEL = {
-    60: {  # 'e'
-        60: 2,  # 'e'
-        55: 1,  # 'o'
-        58: 2,  # 't'
-        36: 1,  # '·'
-        61: 0,  # 'Ά'
-        46: 0,  # 'Έ'
-        54: 0,  # 'Ό'
-        31: 0,  # 'Α'
-        51: 0,  # 'Î’'
-        43: 0,  # 'Γ'
-        41: 0,  # 'Δ'
-        34: 0,  # 'Ε'
-        40: 0,  # 'Η'
-        52: 0,  # 'Θ'
-        47: 0,  # 'Ι'
-        44: 0,  # 'Κ'
-        53: 0,  # 'Λ'
-        38: 0,  # 'Μ'
-        49: 0,  # 'Î'
-        59: 0,  # 'Ξ'
-        39: 0,  # 'Ο'
-        35: 0,  # 'Π'
-        48: 0,  # 'Ρ'
-        37: 0,  # 'Σ'
-        33: 0,  # 'Τ'
-        45: 0,  # 'Î¥'
-        56: 0,  # 'Φ'
-        50: 1,  # 'Χ'
-        57: 0,  # 'Ω'
-        17: 0,  # 'ά'
-        18: 0,  # 'έ'
-        22: 0,  # 'ή'
-        15: 0,  # 'ί'
-        1: 0,  # 'α'
-        29: 0,  # 'β'
-        20: 0,  # 'γ'
-        21: 0,  # 'δ'
-        3: 0,  # 'ε'
-        32: 0,  # 'ζ'
-        13: 0,  # 'η'
-        25: 0,  # 'θ'
-        5: 0,  # 'ι'
-        11: 0,  # 'κ'
-        16: 0,  # 'λ'
-        10: 0,  # 'μ'
-        6: 0,  # 'ν'
-        30: 0,  # 'ξ'
-        4: 0,  # 'ο'
-        9: 0,  # 'Ï€'
-        8: 0,  # 'Ï'
-        14: 0,  # 'Ï‚'
-        7: 0,  # 'σ'
-        2: 0,  # 'Ï„'
-        12: 0,  # 'Ï…'
-        28: 0,  # 'φ'
-        23: 0,  # 'χ'
-        42: 0,  # 'ψ'
-        24: 0,  # 'ω'
-        19: 0,  # 'ό'
-        26: 0,  # 'Ï'
-        27: 0,  # 'ÏŽ'
-    },
-    55: {  # 'o'
-        60: 0,  # 'e'
-        55: 2,  # 'o'
-        58: 2,  # 't'
-        36: 1,  # '·'
-        61: 0,  # 'Ά'
-        46: 0,  # 'Έ'
-        54: 0,  # 'Ό'
-        31: 0,  # 'Α'
-        51: 0,  # 'Î’'
-        43: 0,  # 'Γ'
-        41: 0,  # 'Δ'
-        34: 0,  # 'Ε'
-        40: 0,  # 'Η'
-        52: 0,  # 'Θ'
-        47: 0,  # 'Ι'
-        44: 0,  # 'Κ'
-        53: 0,  # 'Λ'
-        38: 0,  # 'Μ'
-        49: 0,  # 'Î'
-        59: 0,  # 'Ξ'
-        39: 0,  # 'Ο'
-        35: 0,  # 'Π'
-        48: 0,  # 'Ρ'
-        37: 0,  # 'Σ'
-        33: 0,  # 'Τ'
-        45: 0,  # 'Î¥'
-        56: 0,  # 'Φ'
-        50: 0,  # 'Χ'
-        57: 0,  # 'Ω'
-        17: 0,  # 'ά'
-        18: 0,  # 'έ'
-        22: 0,  # 'ή'
-        15: 0,  # 'ί'
-        1: 0,  # 'α'
-        29: 0,  # 'β'
-        20: 0,  # 'γ'
-        21: 0,  # 'δ'
-        3: 0,  # 'ε'
-        32: 0,  # 'ζ'
-        13: 0,  # 'η'
-        25: 0,  # 'θ'
-        5: 0,  # 'ι'
-        11: 0,  # 'κ'
-        16: 0,  # 'λ'
-        10: 0,  # 'μ'
-        6: 1,  # 'ν'
-        30: 0,  # 'ξ'
-        4: 0,  # 'ο'
-        9: 0,  # 'Ï€'
-        8: 0,  # 'Ï'
-        14: 0,  # 'Ï‚'
-        7: 0,  # 'σ'
-        2: 0,  # 'Ï„'
-        12: 1,  # 'Ï…'
-        28: 0,  # 'φ'
-        23: 0,  # 'χ'
-        42: 0,  # 'ψ'
-        24: 0,  # 'ω'
-        19: 0,  # 'ό'
-        26: 0,  # 'Ï'
-        27: 0,  # 'ÏŽ'
-    },
-    58: {  # 't'
-        60: 2,  # 'e'
-        55: 1,  # 'o'
-        58: 1,  # 't'
-        36: 0,  # '·'
-        61: 0,  # 'Ά'
-        46: 0,  # 'Έ'
-        54: 0,  # 'Ό'
-        31: 0,  # 'Α'
-        51: 0,  # 'Î’'
-        43: 0,  # 'Γ'
-        41: 0,  # 'Δ'
-        34: 0,  # 'Ε'
-        40: 0,  # 'Η'
-        52: 0,  # 'Θ'
-        47: 0,  # 'Ι'
-        44: 0,  # 'Κ'
-        53: 0,  # 'Λ'
-        38: 0,  # 'Μ'
-        49: 0,  # 'Î'
-        59: 0,  # 'Ξ'
-        39: 0,  # 'Ο'
-        35: 0,  # 'Π'
-        48: 0,  # 'Ρ'
-        37: 0,  # 'Σ'
-        33: 0,  # 'Τ'
-        45: 0,  # 'Î¥'
-        56: 0,  # 'Φ'
-        50: 0,  # 'Χ'
-        57: 0,  # 'Ω'
-        17: 2,  # 'ά'
-        18: 0,  # 'έ'
-        22: 0,  # 'ή'
-        15: 0,  # 'ί'
-        1: 0,  # 'α'
-        29: 0,  # 'β'
-        20: 0,  # 'γ'
-        21: 0,  # 'δ'
-        3: 0,  # 'ε'
-        32: 0,  # 'ζ'
-        13: 0,  # 'η'
-        25: 0,  # 'θ'
-        5: 0,  # 'ι'
-        11: 0,  # 'κ'
-        16: 0,  # 'λ'
-        10: 0,  # 'μ'
-        6: 0,  # 'ν'
-        30: 0,  # 'ξ'
-        4: 1,  # 'ο'
-        9: 0,  # 'Ï€'
-        8: 0,  # 'Ï'
-        14: 0,  # 'Ï‚'
-        7: 0,  # 'σ'
-        2: 0,  # 'Ï„'
-        12: 0,  # 'Ï…'
-        28: 0,  # 'φ'
-        23: 0,  # 'χ'
-        42: 0,  # 'ψ'
-        24: 0,  # 'ω'
-        19: 0,  # 'ό'
-        26: 0,  # 'Ï'
-        27: 0,  # 'ÏŽ'
-    },
-    36: {  # '·'
-        60: 0,  # 'e'
-        55: 0,  # 'o'
-        58: 0,  # 't'
-        36: 0,  # '·'
-        61: 0,  # 'Ά'
-        46: 0,  # 'Έ'
-        54: 0,  # 'Ό'
-        31: 0,  # 'Α'
-        51: 0,  # 'Î’'
-        43: 0,  # 'Γ'
-        41: 0,  # 'Δ'
-        34: 0,  # 'Ε'
-        40: 0,  # 'Η'
-        52: 0,  # 'Θ'
-        47: 0,  # 'Ι'
-        44: 0,  # 'Κ'
-        53: 0,  # 'Λ'
-        38: 0,  # 'Μ'
-        49: 0,  # 'Î'
-        59: 0,  # 'Ξ'
-        39: 0,  # 'Ο'
-        35: 0,  # 'Π'
-        48: 0,  # 'Ρ'
-        37: 0,  # 'Σ'
-        33: 0,  # 'Τ'
-        45: 0,  # 'Î¥'
-        56: 0,  # 'Φ'
-        50: 0,  # 'Χ'
-        57: 0,  # 'Ω'
-        17: 0,  # 'ά'
-        18: 0,  # 'έ'
-        22: 0,  # 'ή'
-        15: 0,  # 'ί'
-        1: 0,  # 'α'
-        29: 0,  # 'β'
-        20: 0,  # 'γ'
-        21: 0,  # 'δ'
-        3: 0,  # 'ε'
-        32: 0,  # 'ζ'
-        13: 0,  # 'η'
-        25: 0,  # 'θ'
-        5: 0,  # 'ι'
-        11: 0,  # 'κ'
-        16: 0,  # 'λ'
-        10: 0,  # 'μ'
-        6: 0,  # 'ν'
-        30: 0,  # 'ξ'
-        4: 0,  # 'ο'
-        9: 0,  # 'Ï€'
-        8: 0,  # 'Ï'
-        14: 0,  # 'Ï‚'
-        7: 0,  # 'σ'
-        2: 0,  # 'Ï„'
-        12: 0,  # 'Ï…'
-        28: 0,  # 'φ'
-        23: 0,  # 'χ'
-        42: 0,  # 'ψ'
-        24: 0,  # 'ω'
-        19: 0,  # 'ό'
-        26: 0,  # 'Ï'
-        27: 0,  # 'ÏŽ'
-    },
-    61: {  # 'Ά'
-        60: 0,  # 'e'
-        55: 0,  # 'o'
-        58: 0,  # 't'
-        36: 0,  # '·'
-        61: 0,  # 'Ά'
-        46: 0,  # 'Έ'
-        54: 0,  # 'Ό'
-        31: 0,  # 'Α'
-        51: 0,  # 'Î’'
-        43: 0,  # 'Γ'
-        41: 0,  # 'Δ'
-        34: 0,  # 'Ε'
-        40: 0,  # 'Η'
-        52: 0,  # 'Θ'
-        47: 0,  # 'Ι'
-        44: 0,  # 'Κ'
-        53: 0,  # 'Λ'
-        38: 0,  # 'Μ'
-        49: 0,  # 'Î'
-        59: 0,  # 'Ξ'
-        39: 0,  # 'Ο'
-        35: 0,  # 'Π'
-        48: 0,  # 'Ρ'
-        37: 0,  # 'Σ'
-        33: 0,  # 'Τ'
-        45: 0,  # 'Î¥'
-        56: 0,  # 'Φ'
-        50: 0,  # 'Χ'
-        57: 0,  # 'Ω'
-        17: 0,  # 'ά'
-        18: 0,  # 'έ'
-        22: 0,  # 'ή'
-        15: 0,  # 'ί'
-        1: 0,  # 'α'
-        29: 0,  # 'β'
-        20: 1,  # 'γ'
-        21: 2,  # 'δ'
-        3: 0,  # 'ε'
-        32: 0,  # 'ζ'
-        13: 0,  # 'η'
-        25: 0,  # 'θ'
-        5: 0,  # 'ι'
-        11: 0,  # 'κ'
-        16: 2,  # 'λ'
-        10: 0,  # 'μ'
-        6: 0,  # 'ν'
-        30: 0,  # 'ξ'
-        4: 0,  # 'ο'
-        9: 1,  # 'Ï€'
-        8: 2,  # 'Ï'
-        14: 0,  # 'Ï‚'
-        7: 0,  # 'σ'
-        2: 0,  # 'Ï„'
-        12: 0,  # 'Ï…'
-        28: 0,  # 'φ'
-        23: 0,  # 'χ'
-        42: 0,  # 'ψ'
-        24: 0,  # 'ω'
-        19: 0,  # 'ό'
-        26: 0,  # 'Ï'
-        27: 0,  # 'ÏŽ'
-    },
-    46: {  # 'Έ'
-        60: 0,  # 'e'
-        55: 0,  # 'o'
-        58: 0,  # 't'
-        36: 0,  # '·'
-        61: 0,  # 'Ά'
-        46: 0,  # 'Έ'
-        54: 0,  # 'Ό'
-        31: 0,  # 'Α'
-        51: 0,  # 'Î’'
-        43: 0,  # 'Γ'
-        41: 0,  # 'Δ'
-        34: 0,  # 'Ε'
-        40: 0,  # 'Η'
-        52: 0,  # 'Θ'
-        47: 0,  # 'Ι'
-        44: 0,  # 'Κ'
-        53: 0,  # 'Λ'
-        38: 0,  # 'Μ'
-        49: 0,  # 'Î'
-        59: 0,  # 'Ξ'
-        39: 0,  # 'Ο'
-        35: 0,  # 'Π'
-        48: 0,  # 'Ρ'
-        37: 0,  # 'Σ'
-        33: 0,  # 'Τ'
-        45: 0,  # 'Î¥'
-        56: 0,  # 'Φ'
-        50: 0,  # 'Χ'
-        57: 0,  # 'Ω'
-        17: 0,  # 'ά'
-        18: 0,  # 'έ'
-        22: 0,  # 'ή'
-        15: 0,  # 'ί'
-        1: 0,  # 'α'
-        29: 2,  # 'β'
-        20: 2,  # 'γ'
-        21: 0,  # 'δ'
-        3: 0,  # 'ε'
-        32: 0,  # 'ζ'
-        13: 0,  # 'η'
-        25: 0,  # 'θ'
-        5: 0,  # 'ι'
-        11: 2,  # 'κ'
-        16: 2,  # 'λ'
-        10: 0,  # 'μ'
-        6: 3,  # 'ν'
-        30: 2,  # 'ξ'
-        4: 0,  # 'ο'
-        9: 2,  # 'Ï€'
-        8: 2,  # 'Ï'
-        14: 0,  # 'Ï‚'
-        7: 1,  # 'σ'
-        2: 2,  # 'Ï„'
-        12: 0,  # 'Ï…'
-        28: 2,  # 'φ'
-        23: 3,  # 'χ'
-        42: 0,  # 'ψ'
-        24: 0,  # 'ω'
-        19: 0,  # 'ό'
-        26: 0,  # 'Ï'
-        27: 0,  # 'ÏŽ'
-    },
-    54: {  # 'Ό'
-        60: 0,  # 'e'
-        55: 0,  # 'o'
-        58: 0,  # 't'
-        36: 0,  # '·'
-        61: 0,  # 'Ά'
-        46: 0,  # 'Έ'
-        54: 0,  # 'Ό'
-        31: 0,  # 'Α'
-        51: 0,  # 'Î’'
-        43: 0,  # 'Γ'
-        41: 0,  # 'Δ'
-        34: 0,  # 'Ε'
-        40: 0,  # 'Η'
-        52: 0,  # 'Θ'
-        47: 0,  # 'Ι'
-        44: 0,  # 'Κ'
-        53: 0,  # 'Λ'
-        38: 0,  # 'Μ'
-        49: 0,  # 'Î'
-        59: 0,  # 'Ξ'
-        39: 0,  # 'Ο'
-        35: 0,  # 'Π'
-        48: 0,  # 'Ρ'
-        37: 0,  # 'Σ'
-        33: 0,  # 'Τ'
-        45: 0,  # 'Î¥'
-        56: 0,  # 'Φ'
-        50: 0,  # 'Χ'
-        57: 0,  # 'Ω'
-        17: 0,  # 'ά'
-        18: 0,  # 'έ'
-        22: 0,  # 'ή'
-        15: 0,  # 'ί'
-        1: 0,  # 'α'
-        29: 0,  # 'β'
-        20: 0,  # 'γ'
-        21: 0,  # 'δ'
-        3: 0,  # 'ε'
-        32: 0,  # 'ζ'
-        13: 0,  # 'η'
-        25: 0,  # 'θ'
-        5: 0,  # 'ι'
-        11: 0,  # 'κ'
-        16: 2,  # 'λ'
-        10: 2,  # 'μ'
-        6: 2,  # 'ν'
-        30: 0,  # 'ξ'
-        4: 0,  # 'ο'
-        9: 2,  # 'Ï€'
-        8: 0,  # 'Ï'
-        14: 0,  # 'Ï‚'
-        7: 2,  # 'σ'
-        2: 3,  # 'Ï„'
-        12: 0,  # 'Ï…'
-        28: 0,  # 'φ'
-        23: 2,  # 'χ'
-        42: 0,  # 'ψ'
-        24: 0,  # 'ω'
-        19: 0,  # 'ό'
-        26: 0,  # 'Ï'
-        27: 0,  # 'ÏŽ'
-    },
-    31: {  # 'Α'
-        60: 0,  # 'e'
-        55: 0,  # 'o'
-        58: 0,  # 't'
-        36: 0,  # '·'
-        61: 0,  # 'Ά'
-        46: 0,  # 'Έ'
-        54: 0,  # 'Ό'
-        31: 0,  # 'Α'
-        51: 2,  # 'Î’'
-        43: 2,  # 'Γ'
-        41: 1,  # 'Δ'
-        34: 0,  # 'Ε'
-        40: 0,  # 'Η'
-        52: 2,  # 'Θ'
-        47: 2,  # 'Ι'
-        44: 2,  # 'Κ'
-        53: 2,  # 'Λ'
-        38: 2,  # 'Μ'
-        49: 2,  # 'Î'
-        59: 1,  # 'Ξ'
-        39: 0,  # 'Ο'
-        35: 2,  # 'Π'
-        48: 2,  # 'Ρ'
-        37: 2,  # 'Σ'
-        33: 2,  # 'Τ'
-        45: 2,  # 'Î¥'
-        56: 2,  # 'Φ'
-        50: 0,  # 'Χ'
-        57: 0,  # 'Ω'
-        17: 0,  # 'ά'
-        18: 0,  # 'έ'
-        22: 0,  # 'ή'
-        15: 0,  # 'ί'
-        1: 0,  # 'α'
-        29: 0,  # 'β'
-        20: 2,  # 'γ'
-        21: 0,  # 'δ'
-        3: 0,  # 'ε'
-        32: 0,  # 'ζ'
-        13: 0,  # 'η'
-        25: 1,  # 'θ'
-        5: 0,  # 'ι'
-        11: 2,  # 'κ'
-        16: 3,  # 'λ'
-        10: 2,  # 'μ'
-        6: 3,  # 'ν'
-        30: 2,  # 'ξ'
-        4: 0,  # 'ο'
-        9: 3,  # 'Ï€'
-        8: 3,  # 'Ï'
-        14: 2,  # 'Ï‚'
-        7: 2,  # 'σ'
-        2: 0,  # 'Ï„'
-        12: 3,  # 'Ï…'
-        28: 2,  # 'φ'
-        23: 0,  # 'χ'
-        42: 0,  # 'ψ'
-        24: 0,  # 'ω'
-        19: 0,  # 'ό'
-        26: 2,  # 'Ï'
-        27: 0,  # 'ÏŽ'
-    },
-    51: {  # 'Î’'
-        60: 0,  # 'e'
-        55: 0,  # 'o'
-        58: 0,  # 't'
-        36: 0,  # '·'
-        61: 0,  # 'Ά'
-        46: 0,  # 'Έ'
-        54: 0,  # 'Ό'
-        31: 2,  # 'Α'
-        51: 0,  # 'Î’'
-        43: 0,  # 'Γ'
-        41: 0,  # 'Δ'
-        34: 1,  # 'Ε'
-        40: 1,  # 'Η'
-        52: 0,  # 'Θ'
-        47: 1,  # 'Ι'
-        44: 0,  # 'Κ'
-        53: 1,  # 'Λ'
-        38: 0,  # 'Μ'
-        49: 0,  # 'Î'
-        59: 0,  # 'Ξ'
-        39: 2,  # 'Ο'
-        35: 0,  # 'Π'
-        48: 0,  # 'Ρ'
-        37: 0,  # 'Σ'
-        33: 0,  # 'Τ'
-        45: 0,  # 'Î¥'
-        56: 0,  # 'Φ'
-        50: 0,  # 'Χ'
-        57: 0,  # 'Ω'
-        17: 2,  # 'ά'
-        18: 2,  # 'έ'
-        22: 2,  # 'ή'
-        15: 0,  # 'ί'
-        1: 2,  # 'α'
-        29: 0,  # 'β'
-        20: 0,  # 'γ'
-        21: 0,  # 'δ'
-        3: 2,  # 'ε'
-        32: 0,  # 'ζ'
-        13: 0,  # 'η'
-        25: 0,  # 'θ'
-        5: 2,  # 'ι'
-        11: 0,  # 'κ'
-        16: 2,  # 'λ'
-        10: 0,  # 'μ'
-        6: 0,  # 'ν'
-        30: 0,  # 'ξ'
-        4: 2,  # 'ο'
-        9: 0,  # 'Ï€'
-        8: 2,  # 'Ï'
-        14: 0,  # 'Ï‚'
-        7: 0,  # 'σ'
-        2: 0,  # 'Ï„'
-        12: 0,  # 'Ï…'
-        28: 0,  # 'φ'
-        23: 0,  # 'χ'
-        42: 0,  # 'ψ'
-        24: 0,  # 'ω'
-        19: 0,  # 'ό'
-        26: 0,  # 'Ï'
-        27: 0,  # 'ÏŽ'
-    },
-    43: {  # 'Γ'
-        60: 0,  # 'e'
-        55: 0,  # 'o'
-        58: 0,  # 't'
-        36: 0,  # '·'
-        61: 0,  # 'Ά'
-        46: 0,  # 'Έ'
-        54: 0,  # 'Ό'
-        31: 1,  # 'Α'
-        51: 0,  # 'Î’'
-        43: 2,  # 'Γ'
-        41: 0,  # 'Δ'
-        34: 2,  # 'Ε'
-        40: 1,  # 'Η'
-        52: 0,  # 'Θ'
-        47: 2,  # 'Ι'
-        44: 1,  # 'Κ'
-        53: 1,  # 'Λ'
-        38: 0,  # 'Μ'
-        49: 0,  # 'Î'
-        59: 0,  # 'Ξ'
-        39: 1,  # 'Ο'
-        35: 0,  # 'Π'
-        48: 2,  # 'Ρ'
-        37: 0,  # 'Σ'
-        33: 0,  # 'Τ'
-        45: 2,  # 'Î¥'
-        56: 0,  # 'Φ'
-        50: 1,  # 'Χ'
-        57: 2,  # 'Ω'
-        17: 0,  # 'ά'
-        18: 0,  # 'έ'
-        22: 0,  # 'ή'
-        15: 2,  # 'ί'
-        1: 2,  # 'α'
-        29: 0,  # 'β'
-        20: 0,  # 'γ'
-        21: 0,  # 'δ'
-        3: 2,  # 'ε'
-        32: 0,  # 'ζ'
-        13: 0,  # 'η'
-        25: 0,  # 'θ'
-        5: 3,  # 'ι'
-        11: 0,  # 'κ'
-        16: 2,  # 'λ'
-        10: 0,  # 'μ'
-        6: 2,  # 'ν'
-        30: 0,  # 'ξ'
-        4: 0,  # 'ο'
-        9: 0,  # 'Ï€'
-        8: 2,  # 'Ï'
-        14: 0,  # 'Ï‚'
-        7: 0,  # 'σ'
-        2: 0,  # 'Ï„'
-        12: 0,  # 'Ï…'
-        28: 0,  # 'φ'
-        23: 0,  # 'χ'
-        42: 0,  # 'ψ'
-        24: 0,  # 'ω'
-        19: 0,  # 'ό'
-        26: 0,  # 'Ï'
-        27: 0,  # 'ÏŽ'
-    },
-    41: {  # 'Δ'
-        60: 0,  # 'e'
-        55: 0,  # 'o'
-        58: 0,  # 't'
-        36: 0,  # '·'
-        61: 0,  # 'Ά'
-        46: 0,  # 'Έ'
-        54: 0,  # 'Ό'
-        31: 0,  # 'Α'
-        51: 0,  # 'Î’'
-        43: 0,  # 'Γ'
-        41: 0,  # 'Δ'
-        34: 2,  # 'Ε'
-        40: 2,  # 'Η'
-        52: 0,  # 'Θ'
-        47: 2,  # 'Ι'
-        44: 0,  # 'Κ'
-        53: 0,  # 'Λ'
-        38: 0,  # 'Μ'
-        49: 0,  # 'Î'
-        59: 0,  # 'Ξ'
-        39: 2,  # 'Ο'
-        35: 0,  # 'Π'
-        48: 0,  # 'Ρ'
-        37: 0,  # 'Σ'
-        33: 0,  # 'Τ'
-        45: 0,  # 'Î¥'
-        56: 0,  # 'Φ'
-        50: 0,  # 'Χ'
-        57: 2,  # 'Ω'
-        17: 0,  # 'ά'
-        18: 0,  # 'έ'
-        22: 2,  # 'ή'
-        15: 2,  # 'ί'
-        1: 0,  # 'α'
-        29: 0,  # 'β'
-        20: 0,  # 'γ'
-        21: 0,  # 'δ'
-        3: 3,  # 'ε'
-        32: 0,  # 'ζ'
-        13: 2,  # 'η'
-        25: 0,  # 'θ'
-        5: 3,  # 'ι'
-        11: 0,  # 'κ'
-        16: 0,  # 'λ'
-        10: 0,  # 'μ'
-        6: 0,  # 'ν'
-        30: 0,  # 'ξ'
-        4: 2,  # 'ο'
-        9: 0,  # 'Ï€'
-        8: 2,  # 'Ï'
-        14: 0,  # 'Ï‚'
-        7: 0,  # 'σ'
-        2: 0,  # 'Ï„'
-        12: 2,  # 'Ï…'
-        28: 0,  # 'φ'
-        23: 0,  # 'χ'
-        42: 0,  # 'ψ'
-        24: 2,  # 'ω'
-        19: 1,  # 'ό'
-        26: 2,  # 'Ï'
-        27: 2,  # 'ÏŽ'
-    },
-    34: {  # 'Ε'
-        60: 0,  # 'e'
-        55: 0,  # 'o'
-        58: 0,  # 't'
-        36: 0,  # '·'
-        61: 0,  # 'Ά'
-        46: 0,  # 'Έ'
-        54: 0,  # 'Ό'
-        31: 2,  # 'Α'
-        51: 0,  # 'Î’'
-        43: 2,  # 'Γ'
-        41: 2,  # 'Δ'
-        34: 0,  # 'Ε'
-        40: 0,  # 'Η'
-        52: 0,  # 'Θ'
-        47: 2,  # 'Ι'
-        44: 2,  # 'Κ'
-        53: 2,  # 'Λ'
-        38: 2,  # 'Μ'
-        49: 2,  # 'Î'
-        59: 1,  # 'Ξ'
-        39: 0,  # 'Ο'
-        35: 2,  # 'Π'
-        48: 2,  # 'Ρ'
-        37: 2,  # 'Σ'
-        33: 2,  # 'Τ'
-        45: 2,  # 'Î¥'
-        56: 0,  # 'Φ'
-        50: 2,  # 'Χ'
-        57: 2,  # 'Ω'
-        17: 3,  # 'ά'
-        18: 0,  # 'έ'
-        22: 0,  # 'ή'
-        15: 3,  # 'ί'
-        1: 0,  # 'α'
-        29: 0,  # 'β'
-        20: 3,  # 'γ'
-        21: 2,  # 'δ'
-        3: 1,  # 'ε'
-        32: 0,  # 'ζ'
-        13: 0,  # 'η'
-        25: 1,  # 'θ'
-        5: 2,  # 'ι'
-        11: 3,  # 'κ'
-        16: 3,  # 'λ'
-        10: 2,  # 'μ'
-        6: 3,  # 'ν'
-        30: 2,  # 'ξ'
-        4: 0,  # 'ο'
-        9: 3,  # 'Ï€'
-        8: 2,  # 'Ï'
-        14: 0,  # 'Ï‚'
-        7: 2,  # 'σ'
-        2: 2,  # 'Ï„'
-        12: 2,  # 'Ï…'
-        28: 2,  # 'φ'
-        23: 0,  # 'χ'
-        42: 0,  # 'ψ'
-        24: 0,  # 'ω'
-        19: 0,  # 'ό'
-        26: 1,  # 'Ï'
-        27: 0,  # 'ÏŽ'
-    },
-    40: {  # 'Η'
-        60: 0,  # 'e'
-        55: 0,  # 'o'
-        58: 0,  # 't'
-        36: 0,  # '·'
-        61: 0,  # 'Ά'
-        46: 0,  # 'Έ'
-        54: 0,  # 'Ό'
-        31: 0,  # 'Α'
-        51: 0,  # 'Î’'
-        43: 1,  # 'Γ'
-        41: 0,  # 'Δ'
-        34: 0,  # 'Ε'
-        40: 0,  # 'Η'
-        52: 2,  # 'Θ'
-        47: 0,  # 'Ι'
-        44: 2,  # 'Κ'
-        53: 0,  # 'Λ'
-        38: 2,  # 'Μ'
-        49: 2,  # 'Î'
-        59: 0,  # 'Ξ'
-        39: 0,  # 'Ο'
-        35: 2,  # 'Π'
-        48: 2,  # 'Ρ'
-        37: 2,  # 'Σ'
-        33: 2,  # 'Τ'
-        45: 1,  # 'Î¥'
-        56: 0,  # 'Φ'
-        50: 0,  # 'Χ'
-        57: 0,  # 'Ω'
-        17: 0,  # 'ά'
-        18: 0,  # 'έ'
-        22: 0,  # 'ή'
-        15: 0,  # 'ί'
-        1: 0,  # 'α'
-        29: 0,  # 'β'
-        20: 0,  # 'γ'
-        21: 0,  # 'δ'
-        3: 0,  # 'ε'
-        32: 0,  # 'ζ'
-        13: 0,  # 'η'
-        25: 0,  # 'θ'
-        5: 0,  # 'ι'
-        11: 0,  # 'κ'
-        16: 2,  # 'λ'
-        10: 0,  # 'μ'
-        6: 1,  # 'ν'
-        30: 0,  # 'ξ'
-        4: 0,  # 'ο'
-        9: 0,  # 'Ï€'
-        8: 0,  # 'Ï'
-        14: 0,  # 'Ï‚'
-        7: 0,  # 'σ'
-        2: 0,  # 'Ï„'
-        12: 0,  # 'Ï…'
-        28: 0,  # 'φ'
-        23: 1,  # 'χ'
-        42: 0,  # 'ψ'
-        24: 0,  # 'ω'
-        19: 0,  # 'ό'
-        26: 0,  # 'Ï'
-        27: 0,  # 'ÏŽ'
-    },
-    52: {  # 'Θ'
-        60: 0,  # 'e'
-        55: 0,  # 'o'
-        58: 0,  # 't'
-        36: 0,  # '·'
-        61: 0,  # 'Ά'
-        46: 0,  # 'Έ'
-        54: 0,  # 'Ό'
-        31: 2,  # 'Α'
-        51: 0,  # 'Î’'
-        43: 0,  # 'Γ'
-        41: 0,  # 'Δ'
-        34: 2,  # 'Ε'
-        40: 2,  # 'Η'
-        52: 0,  # 'Θ'
-        47: 0,  # 'Ι'
-        44: 0,  # 'Κ'
-        53: 0,  # 'Λ'
-        38: 0,  # 'Μ'
-        49: 0,  # 'Î'
-        59: 0,  # 'Ξ'
-        39: 2,  # 'Ο'
-        35: 0,  # 'Π'
-        48: 1,  # 'Ρ'
-        37: 0,  # 'Σ'
-        33: 0,  # 'Τ'
-        45: 1,  # 'Î¥'
-        56: 0,  # 'Φ'
-        50: 0,  # 'Χ'
-        57: 0,  # 'Ω'
-        17: 0,  # 'ά'
-        18: 2,  # 'έ'
-        22: 0,  # 'ή'
-        15: 0,  # 'ί'
-        1: 3,  # 'α'
-        29: 0,  # 'β'
-        20: 0,  # 'γ'
-        21: 0,  # 'δ'
-        3: 2,  # 'ε'
-        32: 0,  # 'ζ'
-        13: 0,  # 'η'
-        25: 0,  # 'θ'
-        5: 0,  # 'ι'
-        11: 0,  # 'κ'
-        16: 0,  # 'λ'
-        10: 0,  # 'μ'
-        6: 0,  # 'ν'
-        30: 0,  # 'ξ'
-        4: 0,  # 'ο'
-        9: 0,  # 'Ï€'
-        8: 0,  # 'Ï'
-        14: 0,  # 'Ï‚'
-        7: 0,  # 'σ'
-        2: 0,  # 'Ï„'
-        12: 2,  # 'Ï…'
-        28: 0,  # 'φ'
-        23: 0,  # 'χ'
-        42: 0,  # 'ψ'
-        24: 0,  # 'ω'
-        19: 0,  # 'ό'
-        26: 2,  # 'Ï'
-        27: 0,  # 'ÏŽ'
-    },
-    47: {  # 'Ι'
-        60: 0,  # 'e'
-        55: 0,  # 'o'
-        58: 0,  # 't'
-        36: 0,  # '·'
-        61: 0,  # 'Ά'
-        46: 0,  # 'Έ'
-        54: 0,  # 'Ό'
-        31: 2,  # 'Α'
-        51: 1,  # 'Î’'
-        43: 1,  # 'Γ'
-        41: 2,  # 'Δ'
-        34: 2,  # 'Ε'
-        40: 2,  # 'Η'
-        52: 0,  # 'Θ'
-        47: 0,  # 'Ι'
-        44: 2,  # 'Κ'
-        53: 2,  # 'Λ'
-        38: 2,  # 'Μ'
-        49: 2,  # 'Î'
-        59: 0,  # 'Ξ'
-        39: 2,  # 'Ο'
-        35: 0,  # 'Π'
-        48: 2,  # 'Ρ'
-        37: 2,  # 'Σ'
-        33: 2,  # 'Τ'
-        45: 0,  # 'Î¥'
-        56: 2,  # 'Φ'
-        50: 0,  # 'Χ'
-        57: 2,  # 'Ω'
-        17: 0,  # 'ά'
-        18: 0,  # 'έ'
-        22: 0,  # 'ή'
-        15: 0,  # 'ί'
-        1: 2,  # 'α'
-        29: 0,  # 'β'
-        20: 0,  # 'γ'
-        21: 2,  # 'δ'
-        3: 0,  # 'ε'
-        32: 0,  # 'ζ'
-        13: 0,  # 'η'
-        25: 0,  # 'θ'
-        5: 0,  # 'ι'
-        11: 0,  # 'κ'
-        16: 0,  # 'λ'
-        10: 0,  # 'μ'
-        6: 1,  # 'ν'
-        30: 0,  # 'ξ'
-        4: 2,  # 'ο'
-        9: 0,  # 'Ï€'
-        8: 0,  # 'Ï'
-        14: 0,  # 'Ï‚'
-        7: 2,  # 'σ'
-        2: 1,  # 'Ï„'
-        12: 0,  # 'Ï…'
-        28: 0,  # 'φ'
-        23: 0,  # 'χ'
-        42: 0,  # 'ψ'
-        24: 1,  # 'ω'
-        19: 0,  # 'ό'
-        26: 0,  # 'Ï'
-        27: 0,  # 'ÏŽ'
-    },
-    44: {  # 'Κ'
-        60: 0,  # 'e'
-        55: 0,  # 'o'
-        58: 0,  # 't'
-        36: 0,  # '·'
-        61: 0,  # 'Ά'
-        46: 0,  # 'Έ'
-        54: 0,  # 'Ό'
-        31: 2,  # 'Α'
-        51: 0,  # 'Î’'
-        43: 0,  # 'Γ'
-        41: 1,  # 'Δ'
-        34: 2,  # 'Ε'
-        40: 2,  # 'Η'
-        52: 0,  # 'Θ'
-        47: 0,  # 'Ι'
-        44: 0,  # 'Κ'
-        53: 0,  # 'Λ'
-        38: 1,  # 'Μ'
-        49: 0,  # 'Î'
-        59: 0,  # 'Ξ'
-        39: 2,  # 'Ο'
-        35: 0,  # 'Π'
-        48: 2,  # 'Ρ'
-        37: 0,  # 'Σ'
-        33: 1,  # 'Τ'
-        45: 2,  # 'Î¥'
-        56: 0,  # 'Φ'
-        50: 0,  # 'Χ'
-        57: 1,  # 'Ω'
-        17: 3,  # 'ά'
-        18: 0,  # 'έ'
-        22: 0,  # 'ή'
-        15: 0,  # 'ί'
-        1: 3,  # 'α'
-        29: 0,  # 'β'
-        20: 0,  # 'γ'
-        21: 0,  # 'δ'
-        3: 2,  # 'ε'
-        32: 0,  # 'ζ'
-        13: 0,  # 'η'
-        25: 0,  # 'θ'
-        5: 2,  # 'ι'
-        11: 0,  # 'κ'
-        16: 2,  # 'λ'
-        10: 0,  # 'μ'
-        6: 0,  # 'ν'
-        30: 0,  # 'ξ'
-        4: 2,  # 'ο'
-        9: 0,  # 'Ï€'
-        8: 2,  # 'Ï'
-        14: 0,  # 'Ï‚'
-        7: 0,  # 'σ'
-        2: 0,  # 'Ï„'
-        12: 2,  # 'Ï…'
-        28: 0,  # 'φ'
-        23: 0,  # 'χ'
-        42: 0,  # 'ψ'
-        24: 0,  # 'ω'
-        19: 2,  # 'ό'
-        26: 2,  # 'Ï'
-        27: 2,  # 'ÏŽ'
-    },
-    53: {  # 'Λ'
-        60: 0,  # 'e'
-        55: 0,  # 'o'
-        58: 0,  # 't'
-        36: 0,  # '·'
-        61: 0,  # 'Ά'
-        46: 0,  # 'Έ'
-        54: 0,  # 'Ό'
-        31: 2,  # 'Α'
-        51: 0,  # 'Î’'
-        43: 0,  # 'Γ'
-        41: 0,  # 'Δ'
-        34: 2,  # 'Ε'
-        40: 2,  # 'Η'
-        52: 0,  # 'Θ'
-        47: 2,  # 'Ι'
-        44: 0,  # 'Κ'
-        53: 2,  # 'Λ'
-        38: 0,  # 'Μ'
-        49: 0,  # 'Î'
-        59: 0,  # 'Ξ'
-        39: 2,  # 'Ο'
-        35: 0,  # 'Π'
-        48: 0,  # 'Ρ'
-        37: 2,  # 'Σ'
-        33: 0,  # 'Τ'
-        45: 2,  # 'Î¥'
-        56: 0,  # 'Φ'
-        50: 0,  # 'Χ'
-        57: 2,  # 'Ω'
-        17: 2,  # 'ά'
-        18: 2,  # 'έ'
-        22: 0,  # 'ή'
-        15: 2,  # 'ί'
-        1: 2,  # 'α'
-        29: 0,  # 'β'
-        20: 0,  # 'γ'
-        21: 0,  # 'δ'
-        3: 2,  # 'ε'
-        32: 0,  # 'ζ'
-        13: 0,  # 'η'
-        25: 0,  # 'θ'
-        5: 1,  # 'ι'
-        11: 0,  # 'κ'
-        16: 0,  # 'λ'
-        10: 0,  # 'μ'
-        6: 0,  # 'ν'
-        30: 0,  # 'ξ'
-        4: 2,  # 'ο'
-        9: 0,  # 'Ï€'
-        8: 0,  # 'Ï'
-        14: 0,  # 'Ï‚'
-        7: 0,  # 'σ'
-        2: 0,  # 'Ï„'
-        12: 2,  # 'Ï…'
-        28: 0,  # 'φ'
-        23: 0,  # 'χ'
-        42: 0,  # 'ψ'
-        24: 0,  # 'ω'
-        19: 2,  # 'ό'
-        26: 2,  # 'Ï'
-        27: 0,  # 'ÏŽ'
-    },
-    38: {  # 'Μ'
-        60: 0,  # 'e'
-        55: 0,  # 'o'
-        58: 0,  # 't'
-        36: 0,  # '·'
-        61: 0,  # 'Ά'
-        46: 0,  # 'Έ'
-        54: 0,  # 'Ό'
-        31: 2,  # 'Α'
-        51: 2,  # 'Î’'
-        43: 0,  # 'Γ'
-        41: 0,  # 'Δ'
-        34: 2,  # 'Ε'
-        40: 2,  # 'Η'
-        52: 0,  # 'Θ'
-        47: 2,  # 'Ι'
-        44: 0,  # 'Κ'
-        53: 0,  # 'Λ'
-        38: 2,  # 'Μ'
-        49: 0,  # 'Î'
-        59: 0,  # 'Ξ'
-        39: 2,  # 'Ο'
-        35: 2,  # 'Π'
-        48: 0,  # 'Ρ'
-        37: 0,  # 'Σ'
-        33: 0,  # 'Τ'
-        45: 0,  # 'Î¥'
-        56: 0,  # 'Φ'
-        50: 0,  # 'Χ'
-        57: 0,  # 'Ω'
-        17: 2,  # 'ά'
-        18: 2,  # 'έ'
-        22: 2,  # 'ή'
-        15: 2,  # 'ί'
-        1: 2,  # 'α'
-        29: 0,  # 'β'
-        20: 0,  # 'γ'
-        21: 0,  # 'δ'
-        3: 3,  # 'ε'
-        32: 0,  # 'ζ'
-        13: 2,  # 'η'
-        25: 0,  # 'θ'
-        5: 3,  # 'ι'
-        11: 0,  # 'κ'
-        16: 0,  # 'λ'
-        10: 0,  # 'μ'
-        6: 0,  # 'ν'
-        30: 0,  # 'ξ'
-        4: 2,  # 'ο'
-        9: 3,  # 'Ï€'
-        8: 0,  # 'Ï'
-        14: 0,  # 'Ï‚'
-        7: 0,  # 'σ'
-        2: 0,  # 'Ï„'
-        12: 2,  # 'Ï…'
-        28: 0,  # 'φ'
-        23: 0,  # 'χ'
-        42: 0,  # 'ψ'
-        24: 0,  # 'ω'
-        19: 2,  # 'ό'
-        26: 0,  # 'Ï'
-        27: 0,  # 'ÏŽ'
-    },
-    49: {  # 'Î'
-        60: 2,  # 'e'
-        55: 0,  # 'o'
-        58: 0,  # 't'
-        36: 0,  # '·'
-        61: 0,  # 'Ά'
-        46: 0,  # 'Έ'
-        54: 0,  # 'Ό'
-        31: 2,  # 'Α'
-        51: 0,  # 'Î’'
-        43: 0,  # 'Γ'
-        41: 0,  # 'Δ'
-        34: 2,  # 'Ε'
-        40: 2,  # 'Η'
-        52: 0,  # 'Θ'
-        47: 2,  # 'Ι'
-        44: 0,  # 'Κ'
-        53: 0,  # 'Λ'
-        38: 0,  # 'Μ'
-        49: 0,  # 'Î'
-        59: 0,  # 'Ξ'
-        39: 2,  # 'Ο'
-        35: 0,  # 'Π'
-        48: 0,  # 'Ρ'
-        37: 0,  # 'Σ'
-        33: 2,  # 'Τ'
-        45: 0,  # 'Î¥'
-        56: 0,  # 'Φ'
-        50: 0,  # 'Χ'
-        57: 2,  # 'Ω'
-        17: 0,  # 'ά'
-        18: 2,  # 'έ'
-        22: 0,  # 'ή'
-        15: 2,  # 'ί'
-        1: 2,  # 'α'
-        29: 0,  # 'β'
-        20: 0,  # 'γ'
-        21: 0,  # 'δ'
-        3: 1,  # 'ε'
-        32: 0,  # 'ζ'
-        13: 0,  # 'η'
-        25: 0,  # 'θ'
-        5: 0,  # 'ι'
-        11: 0,  # 'κ'
-        16: 0,  # 'λ'
-        10: 0,  # 'μ'
-        6: 0,  # 'ν'
-        30: 0,  # 'ξ'
-        4: 2,  # 'ο'
-        9: 0,  # 'Ï€'
-        8: 0,  # 'Ï'
-        14: 0,  # 'Ï‚'
-        7: 0,  # 'σ'
-        2: 0,  # 'Ï„'
-        12: 0,  # 'Ï…'
-        28: 0,  # 'φ'
-        23: 0,  # 'χ'
-        42: 0,  # 'ψ'
-        24: 1,  # 'ω'
-        19: 2,  # 'ό'
-        26: 0,  # 'Ï'
-        27: 0,  # 'ÏŽ'
-    },
-    59: {  # 'Ξ'
-        60: 0,  # 'e'
-        55: 0,  # 'o'
-        58: 0,  # 't'
-        36: 0,  # '·'
-        61: 0,  # 'Ά'
-        46: 0,  # 'Έ'
-        54: 0,  # 'Ό'
-        31: 0,  # 'Α'
-        51: 0,  # 'Î’'
-        43: 0,  # 'Γ'
-        41: 0,  # 'Δ'
-        34: 1,  # 'Ε'
-        40: 1,  # 'Η'
-        52: 0,  # 'Θ'
-        47: 0,  # 'Ι'
-        44: 0,  # 'Κ'
-        53: 0,  # 'Λ'
-        38: 0,  # 'Μ'
-        49: 0,  # 'Î'
-        59: 0,  # 'Ξ'
-        39: 1,  # 'Ο'
-        35: 0,  # 'Π'
-        48: 0,  # 'Ρ'
-        37: 0,  # 'Σ'
-        33: 0,  # 'Τ'
-        45: 0,  # 'Î¥'
-        56: 0,  # 'Φ'
-        50: 0,  # 'Χ'
-        57: 0,  # 'Ω'
-        17: 0,  # 'ά'
-        18: 2,  # 'έ'
-        22: 0,  # 'ή'
-        15: 0,  # 'ί'
-        1: 2,  # 'α'
-        29: 0,  # 'β'
-        20: 0,  # 'γ'
-        21: 0,  # 'δ'
-        3: 2,  # 'ε'
-        32: 0,  # 'ζ'
-        13: 0,  # 'η'
-        25: 0,  # 'θ'
-        5: 0,  # 'ι'
-        11: 0,  # 'κ'
-        16: 0,  # 'λ'
-        10: 0,  # 'μ'
-        6: 0,  # 'ν'
-        30: 0,  # 'ξ'
-        4: 0,  # 'ο'
-        9: 0,  # 'Ï€'
-        8: 0,  # 'Ï'
-        14: 0,  # 'Ï‚'
-        7: 0,  # 'σ'
-        2: 0,  # 'Ï„'
-        12: 0,  # 'Ï…'
-        28: 0,  # 'φ'
-        23: 0,  # 'χ'
-        42: 0,  # 'ψ'
-        24: 0,  # 'ω'
-        19: 0,  # 'ό'
-        26: 0,  # 'Ï'
-        27: 0,  # 'ÏŽ'
-    },
-    39: {  # 'Ο'
-        60: 0,  # 'e'
-        55: 0,  # 'o'
-        58: 0,  # 't'
-        36: 0,  # '·'
-        61: 0,  # 'Ά'
-        46: 0,  # 'Έ'
-        54: 0,  # 'Ό'
-        31: 0,  # 'Α'
-        51: 1,  # 'Î’'
-        43: 2,  # 'Γ'
-        41: 2,  # 'Δ'
-        34: 2,  # 'Ε'
-        40: 1,  # 'Η'
-        52: 2,  # 'Θ'
-        47: 2,  # 'Ι'
-        44: 2,  # 'Κ'
-        53: 2,  # 'Λ'
-        38: 2,  # 'Μ'
-        49: 2,  # 'Î'
-        59: 0,  # 'Ξ'
-        39: 0,  # 'Ο'
-        35: 2,  # 'Π'
-        48: 2,  # 'Ρ'
-        37: 2,  # 'Σ'
-        33: 2,  # 'Τ'
-        45: 2,  # 'Î¥'
-        56: 2,  # 'Φ'
-        50: 2,  # 'Χ'
-        57: 0,  # 'Ω'
-        17: 0,  # 'ά'
-        18: 0,  # 'έ'
-        22: 0,  # 'ή'
-        15: 0,  # 'ί'
-        1: 0,  # 'α'
-        29: 0,  # 'β'
-        20: 0,  # 'γ'
-        21: 2,  # 'δ'
-        3: 0,  # 'ε'
-        32: 0,  # 'ζ'
-        13: 0,  # 'η'
-        25: 0,  # 'θ'
-        5: 3,  # 'ι'
-        11: 2,  # 'κ'
-        16: 2,  # 'λ'
-        10: 2,  # 'μ'
-        6: 2,  # 'ν'
-        30: 0,  # 'ξ'
-        4: 0,  # 'ο'
-        9: 2,  # 'Ï€'
-        8: 2,  # 'Ï'
-        14: 0,  # 'Ï‚'
-        7: 0,  # 'σ'
-        2: 2,  # 'Ï„'
-        12: 2,  # 'Ï…'
-        28: 1,  # 'φ'
-        23: 1,  # 'χ'
-        42: 0,  # 'ψ'
-        24: 0,  # 'ω'
-        19: 0,  # 'ό'
-        26: 2,  # 'Ï'
-        27: 0,  # 'ÏŽ'
-    },
-    35: {  # 'Π'
-        60: 0,  # 'e'
-        55: 0,  # 'o'
-        58: 0,  # 't'
-        36: 0,  # '·'
-        61: 0,  # 'Ά'
-        46: 0,  # 'Έ'
-        54: 0,  # 'Ό'
-        31: 2,  # 'Α'
-        51: 0,  # 'Î’'
-        43: 0,  # 'Γ'
-        41: 0,  # 'Δ'
-        34: 2,  # 'Ε'
-        40: 0,  # 'Η'
-        52: 0,  # 'Θ'
-        47: 2,  # 'Ι'
-        44: 0,  # 'Κ'
-        53: 2,  # 'Λ'
-        38: 1,  # 'Μ'
-        49: 0,  # 'Î'
-        59: 0,  # 'Ξ'
-        39: 2,  # 'Ο'
-        35: 0,  # 'Π'
-        48: 2,  # 'Ρ'
-        37: 0,  # 'Σ'
-        33: 1,  # 'Τ'
-        45: 0,  # 'Î¥'
-        56: 0,  # 'Φ'
-        50: 1,  # 'Χ'
-        57: 2,  # 'Ω'
-        17: 2,  # 'ά'
-        18: 1,  # 'έ'
-        22: 1,  # 'ή'
-        15: 2,  # 'ί'
-        1: 3,  # 'α'
-        29: 0,  # 'β'
-        20: 0,  # 'γ'
-        21: 0,  # 'δ'
-        3: 3,  # 'ε'
-        32: 0,  # 'ζ'
-        13: 2,  # 'η'
-        25: 0,  # 'θ'
-        5: 2,  # 'ι'
-        11: 0,  # 'κ'
-        16: 2,  # 'λ'
-        10: 0,  # 'μ'
-        6: 2,  # 'ν'
-        30: 0,  # 'ξ'
-        4: 3,  # 'ο'
-        9: 0,  # 'Ï€'
-        8: 3,  # 'Ï'
-        14: 0,  # 'Ï‚'
-        7: 0,  # 'σ'
-        2: 0,  # 'Ï„'
-        12: 2,  # 'Ï…'
-        28: 0,  # 'φ'
-        23: 2,  # 'χ'
-        42: 0,  # 'ψ'
-        24: 2,  # 'ω'
-        19: 2,  # 'ό'
-        26: 0,  # 'Ï'
-        27: 3,  # 'ÏŽ'
-    },
-    48: {  # 'Ρ'
-        60: 0,  # 'e'
-        55: 0,  # 'o'
-        58: 0,  # 't'
-        36: 0,  # '·'
-        61: 0,  # 'Ά'
-        46: 0,  # 'Έ'
-        54: 0,  # 'Ό'
-        31: 2,  # 'Α'
-        51: 0,  # 'Î’'
-        43: 1,  # 'Γ'
-        41: 1,  # 'Δ'
-        34: 2,  # 'Ε'
-        40: 2,  # 'Η'
-        52: 0,  # 'Θ'
-        47: 2,  # 'Ι'
-        44: 0,  # 'Κ'
-        53: 0,  # 'Λ'
-        38: 0,  # 'Μ'
-        49: 2,  # 'Î'
-        59: 0,  # 'Ξ'
-        39: 2,  # 'Ο'
-        35: 0,  # 'Π'
-        48: 2,  # 'Ρ'
-        37: 0,  # 'Σ'
-        33: 1,  # 'Τ'
-        45: 1,  # 'Î¥'
-        56: 0,  # 'Φ'
-        50: 1,  # 'Χ'
-        57: 1,  # 'Ω'
-        17: 0,  # 'ά'
-        18: 0,  # 'έ'
-        22: 0,  # 'ή'
-        15: 2,  # 'ί'
-        1: 0,  # 'α'
-        29: 0,  # 'β'
-        20: 0,  # 'γ'
-        21: 0,  # 'δ'
-        3: 0,  # 'ε'
-        32: 0,  # 'ζ'
-        13: 0,  # 'η'
-        25: 0,  # 'θ'
-        5: 0,  # 'ι'
-        11: 0,  # 'κ'
-        16: 0,  # 'λ'
-        10: 0,  # 'μ'
-        6: 0,  # 'ν'
-        30: 0,  # 'ξ'
-        4: 1,  # 'ο'
-        9: 0,  # 'Ï€'
-        8: 0,  # 'Ï'
-        14: 0,  # 'Ï‚'
-        7: 0,  # 'σ'
-        2: 0,  # 'Ï„'
-        12: 3,  # 'Ï…'
-        28: 0,  # 'φ'
-        23: 0,  # 'χ'
-        42: 0,  # 'ψ'
-        24: 2,  # 'ω'
-        19: 0,  # 'ό'
-        26: 2,  # 'Ï'
-        27: 0,  # 'ÏŽ'
-    },
-    37: {  # 'Σ'
-        60: 0,  # 'e'
-        55: 0,  # 'o'
-        58: 0,  # 't'
-        36: 0,  # '·'
-        61: 0,  # 'Ά'
-        46: 0,  # 'Έ'
-        54: 0,  # 'Ό'
-        31: 2,  # 'Α'
-        51: 0,  # 'Î’'
-        43: 0,  # 'Γ'
-        41: 1,  # 'Δ'
-        34: 2,  # 'Ε'
-        40: 2,  # 'Η'
-        52: 0,  # 'Θ'
-        47: 2,  # 'Ι'
-        44: 2,  # 'Κ'
-        53: 0,  # 'Λ'
-        38: 2,  # 'Μ'
-        49: 0,  # 'Î'
-        59: 0,  # 'Ξ'
-        39: 2,  # 'Ο'
-        35: 0,  # 'Π'
-        48: 0,  # 'Ρ'
-        37: 2,  # 'Σ'
-        33: 2,  # 'Τ'
-        45: 2,  # 'Î¥'
-        56: 0,  # 'Φ'
-        50: 2,  # 'Χ'
-        57: 2,  # 'Ω'
-        17: 0,  # 'ά'
-        18: 0,  # 'έ'
-        22: 2,  # 'ή'
-        15: 2,  # 'ί'
-        1: 2,  # 'α'
-        29: 2,  # 'β'
-        20: 0,  # 'γ'
-        21: 0,  # 'δ'
-        3: 3,  # 'ε'
-        32: 0,  # 'ζ'
-        13: 3,  # 'η'
-        25: 0,  # 'θ'
-        5: 2,  # 'ι'
-        11: 2,  # 'κ'
-        16: 0,  # 'λ'
-        10: 0,  # 'μ'
-        6: 0,  # 'ν'
-        30: 0,  # 'ξ'
-        4: 2,  # 'ο'
-        9: 2,  # 'Ï€'
-        8: 0,  # 'Ï'
-        14: 0,  # 'Ï‚'
-        7: 0,  # 'σ'
-        2: 3,  # 'Ï„'
-        12: 3,  # 'Ï…'
-        28: 0,  # 'φ'
-        23: 2,  # 'χ'
-        42: 0,  # 'ψ'
-        24: 2,  # 'ω'
-        19: 0,  # 'ό'
-        26: 2,  # 'Ï'
-        27: 2,  # 'ÏŽ'
-    },
-    33: {  # 'Τ'
-        60: 0,  # 'e'
-        55: 1,  # 'o'
-        58: 0,  # 't'
-        36: 0,  # '·'
-        61: 0,  # 'Ά'
-        46: 0,  # 'Έ'
-        54: 0,  # 'Ό'
-        31: 2,  # 'Α'
-        51: 0,  # 'Î’'
-        43: 0,  # 'Γ'
-        41: 0,  # 'Δ'
-        34: 2,  # 'Ε'
-        40: 2,  # 'Η'
-        52: 0,  # 'Θ'
-        47: 2,  # 'Ι'
-        44: 2,  # 'Κ'
-        53: 0,  # 'Λ'
-        38: 0,  # 'Μ'
-        49: 0,  # 'Î'
-        59: 0,  # 'Ξ'
-        39: 2,  # 'Ο'
-        35: 0,  # 'Π'
-        48: 2,  # 'Ρ'
-        37: 0,  # 'Σ'
-        33: 1,  # 'Τ'
-        45: 1,  # 'Î¥'
-        56: 0,  # 'Φ'
-        50: 0,  # 'Χ'
-        57: 2,  # 'Ω'
-        17: 2,  # 'ά'
-        18: 2,  # 'έ'
-        22: 0,  # 'ή'
-        15: 2,  # 'ί'
-        1: 3,  # 'α'
-        29: 0,  # 'β'
-        20: 0,  # 'γ'
-        21: 0,  # 'δ'
-        3: 2,  # 'ε'
-        32: 0,  # 'ζ'
-        13: 2,  # 'η'
-        25: 0,  # 'θ'
-        5: 2,  # 'ι'
-        11: 0,  # 'κ'
-        16: 0,  # 'λ'
-        10: 2,  # 'μ'
-        6: 0,  # 'ν'
-        30: 0,  # 'ξ'
-        4: 3,  # 'ο'
-        9: 0,  # 'Ï€'
-        8: 2,  # 'Ï'
-        14: 0,  # 'Ï‚'
-        7: 2,  # 'σ'
-        2: 0,  # 'Ï„'
-        12: 2,  # 'Ï…'
-        28: 0,  # 'φ'
-        23: 0,  # 'χ'
-        42: 0,  # 'ψ'
-        24: 0,  # 'ω'
-        19: 2,  # 'ό'
-        26: 2,  # 'Ï'
-        27: 3,  # 'ÏŽ'
-    },
-    45: {  # 'Î¥'
-        60: 0,  # 'e'
-        55: 0,  # 'o'
-        58: 0,  # 't'
-        36: 0,  # '·'
-        61: 0,  # 'Ά'
-        46: 0,  # 'Έ'
-        54: 0,  # 'Ό'
-        31: 0,  # 'Α'
-        51: 0,  # 'Î’'
-        43: 2,  # 'Γ'
-        41: 0,  # 'Δ'
-        34: 1,  # 'Ε'
-        40: 2,  # 'Η'
-        52: 2,  # 'Θ'
-        47: 0,  # 'Ι'
-        44: 0,  # 'Κ'
-        53: 1,  # 'Λ'
-        38: 2,  # 'Μ'
-        49: 2,  # 'Î'
-        59: 0,  # 'Ξ'
-        39: 0,  # 'Ο'
-        35: 2,  # 'Π'
-        48: 1,  # 'Ρ'
-        37: 2,  # 'Σ'
-        33: 2,  # 'Τ'
-        45: 0,  # 'Î¥'
-        56: 0,  # 'Φ'
-        50: 1,  # 'Χ'
-        57: 0,  # 'Ω'
-        17: 0,  # 'ά'
-        18: 0,  # 'έ'
-        22: 0,  # 'ή'
-        15: 0,  # 'ί'
-        1: 0,  # 'α'
-        29: 0,  # 'β'
-        20: 0,  # 'γ'
-        21: 0,  # 'δ'
-        3: 0,  # 'ε'
-        32: 0,  # 'ζ'
-        13: 0,  # 'η'
-        25: 0,  # 'θ'
-        5: 0,  # 'ι'
-        11: 0,  # 'κ'
-        16: 2,  # 'λ'
-        10: 0,  # 'μ'
-        6: 0,  # 'ν'
-        30: 0,  # 'ξ'
-        4: 0,  # 'ο'
-        9: 3,  # 'Ï€'
-        8: 0,  # 'Ï'
-        14: 0,  # 'Ï‚'
-        7: 0,  # 'σ'
-        2: 0,  # 'Ï„'
-        12: 0,  # 'Ï…'
-        28: 0,  # 'φ'
-        23: 0,  # 'χ'
-        42: 0,  # 'ψ'
-        24: 0,  # 'ω'
-        19: 0,  # 'ό'
-        26: 0,  # 'Ï'
-        27: 0,  # 'ÏŽ'
-    },
-    56: {  # 'Φ'
-        60: 0,  # 'e'
-        55: 0,  # 'o'
-        58: 0,  # 't'
-        36: 0,  # '·'
-        61: 0,  # 'Ά'
-        46: 0,  # 'Έ'
-        54: 0,  # 'Ό'
-        31: 1,  # 'Α'
-        51: 0,  # 'Î’'
-        43: 0,  # 'Γ'
-        41: 0,  # 'Δ'
-        34: 0,  # 'Ε'
-        40: 1,  # 'Η'
-        52: 0,  # 'Θ'
-        47: 2,  # 'Ι'
-        44: 0,  # 'Κ'
-        53: 0,  # 'Λ'
-        38: 0,  # 'Μ'
-        49: 0,  # 'Î'
-        59: 0,  # 'Ξ'
-        39: 2,  # 'Ο'
-        35: 0,  # 'Π'
-        48: 0,  # 'Ρ'
-        37: 0,  # 'Σ'
-        33: 0,  # 'Τ'
-        45: 0,  # 'Î¥'
-        56: 0,  # 'Φ'
-        50: 0,  # 'Χ'
-        57: 0,  # 'Ω'
-        17: 0,  # 'ά'
-        18: 0,  # 'έ'
-        22: 0,  # 'ή'
-        15: 0,  # 'ί'
-        1: 2,  # 'α'
-        29: 0,  # 'β'
-        20: 0,  # 'γ'
-        21: 0,  # 'δ'
-        3: 2,  # 'ε'
-        32: 0,  # 'ζ'
-        13: 0,  # 'η'
-        25: 0,  # 'θ'
-        5: 2,  # 'ι'
-        11: 0,  # 'κ'
-        16: 0,  # 'λ'
-        10: 0,  # 'μ'
-        6: 0,  # 'ν'
-        30: 0,  # 'ξ'
-        4: 2,  # 'ο'
-        9: 0,  # 'Ï€'
-        8: 0,  # 'Ï'
-        14: 0,  # 'Ï‚'
-        7: 0,  # 'σ'
-        2: 2,  # 'Ï„'
-        12: 2,  # 'Ï…'
-        28: 0,  # 'φ'
-        23: 0,  # 'χ'
-        42: 0,  # 'ψ'
-        24: 0,  # 'ω'
-        19: 0,  # 'ό'
-        26: 1,  # 'Ï'
-        27: 1,  # 'ÏŽ'
-    },
-    50: {  # 'Χ'
-        60: 0,  # 'e'
-        55: 0,  # 'o'
-        58: 0,  # 't'
-        36: 0,  # '·'
-        61: 0,  # 'Ά'
-        46: 0,  # 'Έ'
-        54: 0,  # 'Ό'
-        31: 1,  # 'Α'
-        51: 0,  # 'Î’'
-        43: 0,  # 'Γ'
-        41: 0,  # 'Δ'
-        34: 2,  # 'Ε'
-        40: 2,  # 'Η'
-        52: 0,  # 'Θ'
-        47: 2,  # 'Ι'
-        44: 0,  # 'Κ'
-        53: 0,  # 'Λ'
-        38: 0,  # 'Μ'
-        49: 1,  # 'Î'
-        59: 0,  # 'Ξ'
-        39: 1,  # 'Ο'
-        35: 0,  # 'Π'
-        48: 2,  # 'Ρ'
-        37: 0,  # 'Σ'
-        33: 0,  # 'Τ'
-        45: 0,  # 'Î¥'
-        56: 0,  # 'Φ'
-        50: 1,  # 'Χ'
-        57: 1,  # 'Ω'
-        17: 2,  # 'ά'
-        18: 0,  # 'έ'
-        22: 0,  # 'ή'
-        15: 0,  # 'ί'
-        1: 2,  # 'α'
-        29: 0,  # 'β'
-        20: 0,  # 'γ'
-        21: 0,  # 'δ'
-        3: 2,  # 'ε'
-        32: 0,  # 'ζ'
-        13: 0,  # 'η'
-        25: 0,  # 'θ'
-        5: 0,  # 'ι'
-        11: 0,  # 'κ'
-        16: 0,  # 'λ'
-        10: 0,  # 'μ'
-        6: 0,  # 'ν'
-        30: 0,  # 'ξ'
-        4: 2,  # 'ο'
-        9: 0,  # 'Ï€'
-        8: 3,  # 'Ï'
-        14: 0,  # 'Ï‚'
-        7: 0,  # 'σ'
-        2: 2,  # 'Ï„'
-        12: 0,  # 'Ï…'
-        28: 0,  # 'φ'
-        23: 0,  # 'χ'
-        42: 0,  # 'ψ'
-        24: 2,  # 'ω'
-        19: 0,  # 'ό'
-        26: 0,  # 'Ï'
-        27: 0,  # 'ÏŽ'
-    },
-    57: {  # 'Ω'
-        60: 0,  # 'e'
-        55: 0,  # 'o'
-        58: 0,  # 't'
-        36: 0,  # '·'
-        61: 0,  # 'Ά'
-        46: 0,  # 'Έ'
-        54: 0,  # 'Ό'
-        31: 0,  # 'Α'
-        51: 0,  # 'Î’'
-        43: 1,  # 'Γ'
-        41: 0,  # 'Δ'
-        34: 0,  # 'Ε'
-        40: 0,  # 'Η'
-        52: 0,  # 'Θ'
-        47: 0,  # 'Ι'
-        44: 0,  # 'Κ'
-        53: 1,  # 'Λ'
-        38: 0,  # 'Μ'
-        49: 2,  # 'Î'
-        59: 0,  # 'Ξ'
-        39: 0,  # 'Ο'
-        35: 0,  # 'Π'
-        48: 2,  # 'Ρ'
-        37: 2,  # 'Σ'
-        33: 2,  # 'Τ'
-        45: 0,  # 'Î¥'
-        56: 0,  # 'Φ'
-        50: 0,  # 'Χ'
-        57: 0,  # 'Ω'
-        17: 0,  # 'ά'
-        18: 0,  # 'έ'
-        22: 0,  # 'ή'
-        15: 0,  # 'ί'
-        1: 0,  # 'α'
-        29: 0,  # 'β'
-        20: 0,  # 'γ'
-        21: 0,  # 'δ'
-        3: 0,  # 'ε'
-        32: 0,  # 'ζ'
-        13: 0,  # 'η'
-        25: 0,  # 'θ'
-        5: 0,  # 'ι'
-        11: 0,  # 'κ'
-        16: 0,  # 'λ'
-        10: 0,  # 'μ'
-        6: 0,  # 'ν'
-        30: 0,  # 'ξ'
-        4: 0,  # 'ο'
-        9: 0,  # 'Ï€'
-        8: 2,  # 'Ï'
-        14: 2,  # 'Ï‚'
-        7: 2,  # 'σ'
-        2: 0,  # 'Ï„'
-        12: 0,  # 'Ï…'
-        28: 0,  # 'φ'
-        23: 1,  # 'χ'
-        42: 0,  # 'ψ'
-        24: 0,  # 'ω'
-        19: 0,  # 'ό'
-        26: 0,  # 'Ï'
-        27: 0,  # 'ÏŽ'
-    },
-    17: {  # 'ά'
-        60: 0,  # 'e'
-        55: 0,  # 'o'
-        58: 0,  # 't'
-        36: 2,  # '·'
-        61: 0,  # 'Ά'
-        46: 0,  # 'Έ'
-        54: 0,  # 'Ό'
-        31: 0,  # 'Α'
-        51: 0,  # 'Î’'
-        43: 0,  # 'Γ'
-        41: 0,  # 'Δ'
-        34: 0,  # 'Ε'
-        40: 0,  # 'Η'
-        52: 0,  # 'Θ'
-        47: 0,  # 'Ι'
-        44: 0,  # 'Κ'
-        53: 0,  # 'Λ'
-        38: 0,  # 'Μ'
-        49: 0,  # 'Î'
-        59: 0,  # 'Ξ'
-        39: 0,  # 'Ο'
-        35: 0,  # 'Π'
-        48: 0,  # 'Ρ'
-        37: 0,  # 'Σ'
-        33: 0,  # 'Τ'
-        45: 0,  # 'Î¥'
-        56: 0,  # 'Φ'
-        50: 0,  # 'Χ'
-        57: 0,  # 'Ω'
-        17: 0,  # 'ά'
-        18: 0,  # 'έ'
-        22: 0,  # 'ή'
-        15: 0,  # 'ί'
-        1: 0,  # 'α'
-        29: 3,  # 'β'
-        20: 3,  # 'γ'
-        21: 3,  # 'δ'
-        3: 3,  # 'ε'
-        32: 3,  # 'ζ'
-        13: 0,  # 'η'
-        25: 3,  # 'θ'
-        5: 2,  # 'ι'
-        11: 3,  # 'κ'
-        16: 3,  # 'λ'
-        10: 3,  # 'μ'
-        6: 3,  # 'ν'
-        30: 3,  # 'ξ'
-        4: 0,  # 'ο'
-        9: 3,  # 'Ï€'
-        8: 3,  # 'Ï'
-        14: 3,  # 'Ï‚'
-        7: 3,  # 'σ'
-        2: 3,  # 'Ï„'
-        12: 0,  # 'Ï…'
-        28: 3,  # 'φ'
-        23: 3,  # 'χ'
-        42: 3,  # 'ψ'
-        24: 2,  # 'ω'
-        19: 0,  # 'ό'
-        26: 0,  # 'Ï'
-        27: 0,  # 'ÏŽ'
-    },
-    18: {  # 'έ'
-        60: 0,  # 'e'
-        55: 0,  # 'o'
-        58: 0,  # 't'
-        36: 0,  # '·'
-        61: 0,  # 'Ά'
-        46: 0,  # 'Έ'
-        54: 0,  # 'Ό'
-        31: 0,  # 'Α'
-        51: 0,  # 'Î’'
-        43: 0,  # 'Γ'
-        41: 0,  # 'Δ'
-        34: 0,  # 'Ε'
-        40: 0,  # 'Η'
-        52: 0,  # 'Θ'
-        47: 0,  # 'Ι'
-        44: 0,  # 'Κ'
-        53: 0,  # 'Λ'
-        38: 0,  # 'Μ'
-        49: 0,  # 'Î'
-        59: 0,  # 'Ξ'
-        39: 0,  # 'Ο'
-        35: 0,  # 'Π'
-        48: 0,  # 'Ρ'
-        37: 0,  # 'Σ'
-        33: 0,  # 'Τ'
-        45: 0,  # 'Î¥'
-        56: 0,  # 'Φ'
-        50: 0,  # 'Χ'
-        57: 0,  # 'Ω'
-        17: 0,  # 'ά'
-        18: 0,  # 'έ'
-        22: 0,  # 'ή'
-        15: 0,  # 'ί'
-        1: 3,  # 'α'
-        29: 2,  # 'β'
-        20: 3,  # 'γ'
-        21: 2,  # 'δ'
-        3: 3,  # 'ε'
-        32: 2,  # 'ζ'
-        13: 0,  # 'η'
-        25: 3,  # 'θ'
-        5: 0,  # 'ι'
-        11: 3,  # 'κ'
-        16: 3,  # 'λ'
-        10: 3,  # 'μ'
-        6: 3,  # 'ν'
-        30: 3,  # 'ξ'
-        4: 3,  # 'ο'
-        9: 3,  # 'Ï€'
-        8: 3,  # 'Ï'
-        14: 3,  # 'Ï‚'
-        7: 3,  # 'σ'
-        2: 3,  # 'Ï„'
-        12: 0,  # 'Ï…'
-        28: 3,  # 'φ'
-        23: 3,  # 'χ'
-        42: 3,  # 'ψ'
-        24: 2,  # 'ω'
-        19: 0,  # 'ό'
-        26: 0,  # 'Ï'
-        27: 0,  # 'ÏŽ'
-    },
-    22: {  # 'ή'
-        60: 0,  # 'e'
-        55: 0,  # 'o'
-        58: 0,  # 't'
-        36: 1,  # '·'
-        61: 0,  # 'Ά'
-        46: 0,  # 'Έ'
-        54: 0,  # 'Ό'
-        31: 0,  # 'Α'
-        51: 0,  # 'Î’'
-        43: 0,  # 'Γ'
-        41: 0,  # 'Δ'
-        34: 0,  # 'Ε'
-        40: 0,  # 'Η'
-        52: 0,  # 'Θ'
-        47: 0,  # 'Ι'
-        44: 0,  # 'Κ'
-        53: 0,  # 'Λ'
-        38: 0,  # 'Μ'
-        49: 0,  # 'Î'
-        59: 0,  # 'Ξ'
-        39: 0,  # 'Ο'
-        35: 0,  # 'Π'
-        48: 0,  # 'Ρ'
-        37: 0,  # 'Σ'
-        33: 0,  # 'Τ'
-        45: 0,  # 'Î¥'
-        56: 0,  # 'Φ'
-        50: 0,  # 'Χ'
-        57: 0,  # 'Ω'
-        17: 0,  # 'ά'
-        18: 0,  # 'έ'
-        22: 0,  # 'ή'
-        15: 0,  # 'ί'
-        1: 0,  # 'α'
-        29: 0,  # 'β'
-        20: 3,  # 'γ'
-        21: 3,  # 'δ'
-        3: 0,  # 'ε'
-        32: 0,  # 'ζ'
-        13: 0,  # 'η'
-        25: 3,  # 'θ'
-        5: 0,  # 'ι'
-        11: 3,  # 'κ'
-        16: 2,  # 'λ'
-        10: 3,  # 'μ'
-        6: 3,  # 'ν'
-        30: 2,  # 'ξ'
-        4: 0,  # 'ο'
-        9: 3,  # 'Ï€'
-        8: 3,  # 'Ï'
-        14: 3,  # 'Ï‚'
-        7: 3,  # 'σ'
-        2: 3,  # 'Ï„'
-        12: 0,  # 'Ï…'
-        28: 2,  # 'φ'
-        23: 3,  # 'χ'
-        42: 2,  # 'ψ'
-        24: 0,  # 'ω'
-        19: 0,  # 'ό'
-        26: 0,  # 'Ï'
-        27: 0,  # 'ÏŽ'
-    },
-    15: {  # 'ί'
-        60: 0,  # 'e'
-        55: 0,  # 'o'
-        58: 0,  # 't'
-        36: 0,  # '·'
-        61: 0,  # 'Ά'
-        46: 0,  # 'Έ'
-        54: 0,  # 'Ό'
-        31: 0,  # 'Α'
-        51: 0,  # 'Î’'
-        43: 0,  # 'Γ'
-        41: 0,  # 'Δ'
-        34: 0,  # 'Ε'
-        40: 0,  # 'Η'
-        52: 0,  # 'Θ'
-        47: 0,  # 'Ι'
-        44: 0,  # 'Κ'
-        53: 0,  # 'Λ'
-        38: 0,  # 'Μ'
-        49: 0,  # 'Î'
-        59: 0,  # 'Ξ'
-        39: 0,  # 'Ο'
-        35: 0,  # 'Π'
-        48: 0,  # 'Ρ'
-        37: 0,  # 'Σ'
-        33: 0,  # 'Τ'
-        45: 0,  # 'Î¥'
-        56: 0,  # 'Φ'
-        50: 0,  # 'Χ'
-        57: 0,  # 'Ω'
-        17: 0,  # 'ά'
-        18: 0,  # 'έ'
-        22: 0,  # 'ή'
-        15: 0,  # 'ί'
-        1: 3,  # 'α'
-        29: 2,  # 'β'
-        20: 3,  # 'γ'
-        21: 3,  # 'δ'
-        3: 3,  # 'ε'
-        32: 3,  # 'ζ'
-        13: 3,  # 'η'
-        25: 3,  # 'θ'
-        5: 0,  # 'ι'
-        11: 3,  # 'κ'
-        16: 3,  # 'λ'
-        10: 3,  # 'μ'
-        6: 3,  # 'ν'
-        30: 3,  # 'ξ'
-        4: 3,  # 'ο'
-        9: 3,  # 'Ï€'
-        8: 3,  # 'Ï'
-        14: 3,  # 'Ï‚'
-        7: 3,  # 'σ'
-        2: 3,  # 'Ï„'
-        12: 0,  # 'Ï…'
-        28: 1,  # 'φ'
-        23: 3,  # 'χ'
-        42: 2,  # 'ψ'
-        24: 3,  # 'ω'
-        19: 0,  # 'ό'
-        26: 0,  # 'Ï'
-        27: 0,  # 'ÏŽ'
-    },
-    1: {  # 'α'
-        60: 0,  # 'e'
-        55: 0,  # 'o'
-        58: 0,  # 't'
-        36: 2,  # '·'
-        61: 0,  # 'Ά'
-        46: 0,  # 'Έ'
-        54: 0,  # 'Ό'
-        31: 0,  # 'Α'
-        51: 0,  # 'Î’'
-        43: 0,  # 'Γ'
-        41: 0,  # 'Δ'
-        34: 0,  # 'Ε'
-        40: 0,  # 'Η'
-        52: 0,  # 'Θ'
-        47: 0,  # 'Ι'
-        44: 0,  # 'Κ'
-        53: 0,  # 'Λ'
-        38: 0,  # 'Μ'
-        49: 0,  # 'Î'
-        59: 0,  # 'Ξ'
-        39: 0,  # 'Ο'
-        35: 0,  # 'Π'
-        48: 0,  # 'Ρ'
-        37: 0,  # 'Σ'
-        33: 0,  # 'Τ'
-        45: 0,  # 'Î¥'
-        56: 0,  # 'Φ'
-        50: 0,  # 'Χ'
-        57: 0,  # 'Ω'
-        17: 0,  # 'ά'
-        18: 2,  # 'έ'
-        22: 0,  # 'ή'
-        15: 3,  # 'ί'
-        1: 0,  # 'α'
-        29: 3,  # 'β'
-        20: 3,  # 'γ'
-        21: 3,  # 'δ'
-        3: 2,  # 'ε'
-        32: 3,  # 'ζ'
-        13: 1,  # 'η'
-        25: 3,  # 'θ'
-        5: 3,  # 'ι'
-        11: 3,  # 'κ'
-        16: 3,  # 'λ'
-        10: 3,  # 'μ'
-        6: 3,  # 'ν'
-        30: 3,  # 'ξ'
-        4: 2,  # 'ο'
-        9: 3,  # 'Ï€'
-        8: 3,  # 'Ï'
-        14: 3,  # 'Ï‚'
-        7: 3,  # 'σ'
-        2: 3,  # 'Ï„'
-        12: 3,  # 'Ï…'
-        28: 3,  # 'φ'
-        23: 3,  # 'χ'
-        42: 2,  # 'ψ'
-        24: 0,  # 'ω'
-        19: 2,  # 'ό'
-        26: 2,  # 'Ï'
-        27: 0,  # 'ÏŽ'
-    },
-    29: {  # 'β'
-        60: 0,  # 'e'
-        55: 0,  # 'o'
-        58: 0,  # 't'
-        36: 0,  # '·'
-        61: 0,  # 'Ά'
-        46: 0,  # 'Έ'
-        54: 0,  # 'Ό'
-        31: 0,  # 'Α'
-        51: 0,  # 'Î’'
-        43: 0,  # 'Γ'
-        41: 0,  # 'Δ'
-        34: 0,  # 'Ε'
-        40: 0,  # 'Η'
-        52: 0,  # 'Θ'
-        47: 0,  # 'Ι'
-        44: 0,  # 'Κ'
-        53: 0,  # 'Λ'
-        38: 0,  # 'Μ'
-        49: 0,  # 'Î'
-        59: 0,  # 'Ξ'
-        39: 0,  # 'Ο'
-        35: 0,  # 'Π'
-        48: 0,  # 'Ρ'
-        37: 0,  # 'Σ'
-        33: 0,  # 'Τ'
-        45: 0,  # 'Î¥'
-        56: 0,  # 'Φ'
-        50: 0,  # 'Χ'
-        57: 0,  # 'Ω'
-        17: 3,  # 'ά'
-        18: 2,  # 'έ'
-        22: 3,  # 'ή'
-        15: 2,  # 'ί'
-        1: 3,  # 'α'
-        29: 0,  # 'β'
-        20: 2,  # 'γ'
-        21: 2,  # 'δ'
-        3: 3,  # 'ε'
-        32: 0,  # 'ζ'
-        13: 2,  # 'η'
-        25: 0,  # 'θ'
-        5: 3,  # 'ι'
-        11: 0,  # 'κ'
-        16: 3,  # 'λ'
-        10: 0,  # 'μ'
-        6: 0,  # 'ν'
-        30: 0,  # 'ξ'
-        4: 3,  # 'ο'
-        9: 0,  # 'Ï€'
-        8: 3,  # 'Ï'
-        14: 0,  # 'Ï‚'
-        7: 0,  # 'σ'
-        2: 0,  # 'Ï„'
-        12: 0,  # 'Ï…'
-        28: 0,  # 'φ'
-        23: 0,  # 'χ'
-        42: 0,  # 'ψ'
-        24: 2,  # 'ω'
-        19: 2,  # 'ό'
-        26: 2,  # 'Ï'
-        27: 2,  # 'ÏŽ'
-    },
-    20: {  # 'γ'
-        60: 0,  # 'e'
-        55: 0,  # 'o'
-        58: 0,  # 't'
-        36: 0,  # '·'
-        61: 0,  # 'Ά'
-        46: 0,  # 'Έ'
-        54: 0,  # 'Ό'
-        31: 0,  # 'Α'
-        51: 0,  # 'Î’'
-        43: 0,  # 'Γ'
-        41: 0,  # 'Δ'
-        34: 0,  # 'Ε'
-        40: 0,  # 'Η'
-        52: 0,  # 'Θ'
-        47: 0,  # 'Ι'
-        44: 0,  # 'Κ'
-        53: 0,  # 'Λ'
-        38: 0,  # 'Μ'
-        49: 0,  # 'Î'
-        59: 0,  # 'Ξ'
-        39: 0,  # 'Ο'
-        35: 0,  # 'Π'
-        48: 0,  # 'Ρ'
-        37: 0,  # 'Σ'
-        33: 0,  # 'Τ'
-        45: 0,  # 'Î¥'
-        56: 0,  # 'Φ'
-        50: 0,  # 'Χ'
-        57: 0,  # 'Ω'
-        17: 3,  # 'ά'
-        18: 3,  # 'έ'
-        22: 3,  # 'ή'
-        15: 3,  # 'ί'
-        1: 3,  # 'α'
-        29: 0,  # 'β'
-        20: 3,  # 'γ'
-        21: 0,  # 'δ'
-        3: 3,  # 'ε'
-        32: 0,  # 'ζ'
-        13: 3,  # 'η'
-        25: 0,  # 'θ'
-        5: 3,  # 'ι'
-        11: 3,  # 'κ'
-        16: 3,  # 'λ'
-        10: 3,  # 'μ'
-        6: 3,  # 'ν'
-        30: 3,  # 'ξ'
-        4: 3,  # 'ο'
-        9: 0,  # 'Ï€'
-        8: 3,  # 'Ï'
-        14: 0,  # 'Ï‚'
-        7: 0,  # 'σ'
-        2: 0,  # 'Ï„'
-        12: 2,  # 'Ï…'
-        28: 0,  # 'φ'
-        23: 3,  # 'χ'
-        42: 0,  # 'ψ'
-        24: 3,  # 'ω'
-        19: 3,  # 'ό'
-        26: 2,  # 'Ï'
-        27: 3,  # 'ÏŽ'
-    },
-    21: {  # 'δ'
-        60: 0,  # 'e'
-        55: 0,  # 'o'
-        58: 0,  # 't'
-        36: 0,  # '·'
-        61: 0,  # 'Ά'
-        46: 0,  # 'Έ'
-        54: 0,  # 'Ό'
-        31: 0,  # 'Α'
-        51: 0,  # 'Î’'
-        43: 0,  # 'Γ'
-        41: 0,  # 'Δ'
-        34: 0,  # 'Ε'
-        40: 0,  # 'Η'
-        52: 0,  # 'Θ'
-        47: 0,  # 'Ι'
-        44: 0,  # 'Κ'
-        53: 0,  # 'Λ'
-        38: 0,  # 'Μ'
-        49: 0,  # 'Î'
-        59: 0,  # 'Ξ'
-        39: 0,  # 'Ο'
-        35: 0,  # 'Π'
-        48: 0,  # 'Ρ'
-        37: 0,  # 'Σ'
-        33: 0,  # 'Τ'
-        45: 0,  # 'Î¥'
-        56: 0,  # 'Φ'
-        50: 0,  # 'Χ'
-        57: 0,  # 'Ω'
-        17: 2,  # 'ά'
-        18: 3,  # 'έ'
-        22: 3,  # 'ή'
-        15: 3,  # 'ί'
-        1: 3,  # 'α'
-        29: 0,  # 'β'
-        20: 0,  # 'γ'
-        21: 0,  # 'δ'
-        3: 3,  # 'ε'
-        32: 0,  # 'ζ'
-        13: 3,  # 'η'
-        25: 0,  # 'θ'
-        5: 3,  # 'ι'
-        11: 0,  # 'κ'
-        16: 0,  # 'λ'
-        10: 0,  # 'μ'
-        6: 0,  # 'ν'
-        30: 0,  # 'ξ'
-        4: 3,  # 'ο'
-        9: 0,  # 'Ï€'
-        8: 3,  # 'Ï'
-        14: 0,  # 'Ï‚'
-        7: 0,  # 'σ'
-        2: 0,  # 'Ï„'
-        12: 3,  # 'Ï…'
-        28: 0,  # 'φ'
-        23: 0,  # 'χ'
-        42: 0,  # 'ψ'
-        24: 3,  # 'ω'
-        19: 3,  # 'ό'
-        26: 3,  # 'Ï'
-        27: 3,  # 'ÏŽ'
-    },
-    3: {  # 'ε'
-        60: 0,  # 'e'
-        55: 0,  # 'o'
-        58: 0,  # 't'
-        36: 2,  # '·'
-        61: 0,  # 'Ά'
-        46: 0,  # 'Έ'
-        54: 0,  # 'Ό'
-        31: 0,  # 'Α'
-        51: 0,  # 'Î’'
-        43: 0,  # 'Γ'
-        41: 0,  # 'Δ'
-        34: 0,  # 'Ε'
-        40: 0,  # 'Η'
-        52: 0,  # 'Θ'
-        47: 0,  # 'Ι'
-        44: 0,  # 'Κ'
-        53: 0,  # 'Λ'
-        38: 0,  # 'Μ'
-        49: 0,  # 'Î'
-        59: 0,  # 'Ξ'
-        39: 0,  # 'Ο'
-        35: 0,  # 'Π'
-        48: 0,  # 'Ρ'
-        37: 0,  # 'Σ'
-        33: 0,  # 'Τ'
-        45: 0,  # 'Î¥'
-        56: 0,  # 'Φ'
-        50: 0,  # 'Χ'
-        57: 0,  # 'Ω'
-        17: 3,  # 'ά'
-        18: 0,  # 'έ'
-        22: 0,  # 'ή'
-        15: 3,  # 'ί'
-        1: 2,  # 'α'
-        29: 3,  # 'β'
-        20: 3,  # 'γ'
-        21: 3,  # 'δ'
-        3: 2,  # 'ε'
-        32: 2,  # 'ζ'
-        13: 0,  # 'η'
-        25: 3,  # 'θ'
-        5: 3,  # 'ι'
-        11: 3,  # 'κ'
-        16: 3,  # 'λ'
-        10: 3,  # 'μ'
-        6: 3,  # 'ν'
-        30: 3,  # 'ξ'
-        4: 2,  # 'ο'
-        9: 3,  # 'Ï€'
-        8: 3,  # 'Ï'
-        14: 3,  # 'Ï‚'
-        7: 3,  # 'σ'
-        2: 3,  # 'Ï„'
-        12: 3,  # 'Ï…'
-        28: 3,  # 'φ'
-        23: 3,  # 'χ'
-        42: 2,  # 'ψ'
-        24: 3,  # 'ω'
-        19: 2,  # 'ό'
-        26: 3,  # 'Ï'
-        27: 2,  # 'ÏŽ'
-    },
-    32: {  # 'ζ'
-        60: 0,  # 'e'
-        55: 0,  # 'o'
-        58: 0,  # 't'
-        36: 0,  # '·'
-        61: 0,  # 'Ά'
-        46: 0,  # 'Έ'
-        54: 0,  # 'Ό'
-        31: 0,  # 'Α'
-        51: 0,  # 'Î’'
-        43: 0,  # 'Γ'
-        41: 0,  # 'Δ'
-        34: 0,  # 'Ε'
-        40: 0,  # 'Η'
-        52: 0,  # 'Θ'
-        47: 0,  # 'Ι'
-        44: 0,  # 'Κ'
-        53: 0,  # 'Λ'
-        38: 0,  # 'Μ'
-        49: 0,  # 'Î'
-        59: 0,  # 'Ξ'
-        39: 0,  # 'Ο'
-        35: 0,  # 'Π'
-        48: 0,  # 'Ρ'
-        37: 0,  # 'Σ'
-        33: 0,  # 'Τ'
-        45: 0,  # 'Î¥'
-        56: 0,  # 'Φ'
-        50: 0,  # 'Χ'
-        57: 0,  # 'Ω'
-        17: 2,  # 'ά'
-        18: 2,  # 'έ'
-        22: 2,  # 'ή'
-        15: 2,  # 'ί'
-        1: 2,  # 'α'
-        29: 0,  # 'β'
-        20: 0,  # 'γ'
-        21: 0,  # 'δ'
-        3: 3,  # 'ε'
-        32: 0,  # 'ζ'
-        13: 3,  # 'η'
-        25: 0,  # 'θ'
-        5: 2,  # 'ι'
-        11: 0,  # 'κ'
-        16: 0,  # 'λ'
-        10: 0,  # 'μ'
-        6: 0,  # 'ν'
-        30: 0,  # 'ξ'
-        4: 3,  # 'ο'
-        9: 0,  # 'Ï€'
-        8: 0,  # 'Ï'
-        14: 0,  # 'Ï‚'
-        7: 0,  # 'σ'
-        2: 0,  # 'Ï„'
-        12: 1,  # 'Ï…'
-        28: 0,  # 'φ'
-        23: 0,  # 'χ'
-        42: 0,  # 'ψ'
-        24: 3,  # 'ω'
-        19: 2,  # 'ό'
-        26: 0,  # 'Ï'
-        27: 2,  # 'ÏŽ'
-    },
-    13: {  # 'η'
-        60: 0,  # 'e'
-        55: 0,  # 'o'
-        58: 0,  # 't'
-        36: 2,  # '·'
-        61: 0,  # 'Ά'
-        46: 0,  # 'Έ'
-        54: 0,  # 'Ό'
-        31: 0,  # 'Α'
-        51: 0,  # 'Î’'
-        43: 0,  # 'Γ'
-        41: 0,  # 'Δ'
-        34: 0,  # 'Ε'
-        40: 0,  # 'Η'
-        52: 0,  # 'Θ'
-        47: 0,  # 'Ι'
-        44: 0,  # 'Κ'
-        53: 0,  # 'Λ'
-        38: 0,  # 'Μ'
-        49: 0,  # 'Î'
-        59: 0,  # 'Ξ'
-        39: 0,  # 'Ο'
-        35: 0,  # 'Π'
-        48: 0,  # 'Ρ'
-        37: 0,  # 'Σ'
-        33: 0,  # 'Τ'
-        45: 0,  # 'Î¥'
-        56: 0,  # 'Φ'
-        50: 0,  # 'Χ'
-        57: 0,  # 'Ω'
-        17: 0,  # 'ά'
-        18: 0,  # 'έ'
-        22: 0,  # 'ή'
-        15: 0,  # 'ί'
-        1: 0,  # 'α'
-        29: 0,  # 'β'
-        20: 3,  # 'γ'
-        21: 2,  # 'δ'
-        3: 0,  # 'ε'
-        32: 0,  # 'ζ'
-        13: 0,  # 'η'
-        25: 3,  # 'θ'
-        5: 0,  # 'ι'
-        11: 3,  # 'κ'
-        16: 3,  # 'λ'
-        10: 3,  # 'μ'
-        6: 3,  # 'ν'
-        30: 2,  # 'ξ'
-        4: 0,  # 'ο'
-        9: 2,  # 'Ï€'
-        8: 3,  # 'Ï'
-        14: 3,  # 'Ï‚'
-        7: 3,  # 'σ'
-        2: 3,  # 'Ï„'
-        12: 0,  # 'Ï…'
-        28: 2,  # 'φ'
-        23: 3,  # 'χ'
-        42: 2,  # 'ψ'
-        24: 0,  # 'ω'
-        19: 0,  # 'ό'
-        26: 0,  # 'Ï'
-        27: 0,  # 'ÏŽ'
-    },
-    25: {  # 'θ'
-        60: 0,  # 'e'
-        55: 0,  # 'o'
-        58: 0,  # 't'
-        36: 0,  # '·'
-        61: 0,  # 'Ά'
-        46: 0,  # 'Έ'
-        54: 0,  # 'Ό'
-        31: 0,  # 'Α'
-        51: 0,  # 'Î’'
-        43: 0,  # 'Γ'
-        41: 0,  # 'Δ'
-        34: 0,  # 'Ε'
-        40: 0,  # 'Η'
-        52: 0,  # 'Θ'
-        47: 0,  # 'Ι'
-        44: 0,  # 'Κ'
-        53: 0,  # 'Λ'
-        38: 0,  # 'Μ'
-        49: 0,  # 'Î'
-        59: 0,  # 'Ξ'
-        39: 0,  # 'Ο'
-        35: 0,  # 'Π'
-        48: 0,  # 'Ρ'
-        37: 0,  # 'Σ'
-        33: 0,  # 'Τ'
-        45: 0,  # 'Î¥'
-        56: 0,  # 'Φ'
-        50: 0,  # 'Χ'
-        57: 0,  # 'Ω'
-        17: 2,  # 'ά'
-        18: 3,  # 'έ'
-        22: 3,  # 'ή'
-        15: 2,  # 'ί'
-        1: 3,  # 'α'
-        29: 0,  # 'β'
-        20: 0,  # 'γ'
-        21: 0,  # 'δ'
-        3: 3,  # 'ε'
-        32: 0,  # 'ζ'
-        13: 3,  # 'η'
-        25: 0,  # 'θ'
-        5: 3,  # 'ι'
-        11: 0,  # 'κ'
-        16: 1,  # 'λ'
-        10: 3,  # 'μ'
-        6: 2,  # 'ν'
-        30: 0,  # 'ξ'
-        4: 3,  # 'ο'
-        9: 0,  # 'Ï€'
-        8: 3,  # 'Ï'
-        14: 0,  # 'Ï‚'
-        7: 0,  # 'σ'
-        2: 0,  # 'Ï„'
-        12: 3,  # 'Ï…'
-        28: 0,  # 'φ'
-        23: 0,  # 'χ'
-        42: 0,  # 'ψ'
-        24: 3,  # 'ω'
-        19: 3,  # 'ό'
-        26: 3,  # 'Ï'
-        27: 3,  # 'ÏŽ'
-    },
-    5: {  # 'ι'
-        60: 0,  # 'e'
-        55: 1,  # 'o'
-        58: 0,  # 't'
-        36: 2,  # '·'
-        61: 0,  # 'Ά'
-        46: 0,  # 'Έ'
-        54: 0,  # 'Ό'
-        31: 0,  # 'Α'
-        51: 0,  # 'Î’'
-        43: 0,  # 'Γ'
-        41: 0,  # 'Δ'
-        34: 1,  # 'Ε'
-        40: 0,  # 'Η'
-        52: 0,  # 'Θ'
-        47: 0,  # 'Ι'
-        44: 0,  # 'Κ'
-        53: 0,  # 'Λ'
-        38: 0,  # 'Μ'
-        49: 0,  # 'Î'
-        59: 0,  # 'Ξ'
-        39: 0,  # 'Ο'
-        35: 0,  # 'Π'
-        48: 0,  # 'Ρ'
-        37: 0,  # 'Σ'
-        33: 0,  # 'Τ'
-        45: 0,  # 'Î¥'
-        56: 0,  # 'Φ'
-        50: 0,  # 'Χ'
-        57: 0,  # 'Ω'
-        17: 3,  # 'ά'
-        18: 3,  # 'έ'
-        22: 3,  # 'ή'
-        15: 0,  # 'ί'
-        1: 3,  # 'α'
-        29: 3,  # 'β'
-        20: 3,  # 'γ'
-        21: 3,  # 'δ'
-        3: 3,  # 'ε'
-        32: 2,  # 'ζ'
-        13: 3,  # 'η'
-        25: 3,  # 'θ'
-        5: 0,  # 'ι'
-        11: 3,  # 'κ'
-        16: 3,  # 'λ'
-        10: 3,  # 'μ'
-        6: 3,  # 'ν'
-        30: 3,  # 'ξ'
-        4: 3,  # 'ο'
-        9: 3,  # 'Ï€'
-        8: 3,  # 'Ï'
-        14: 3,  # 'Ï‚'
-        7: 3,  # 'σ'
-        2: 3,  # 'Ï„'
-        12: 0,  # 'Ï…'
-        28: 2,  # 'φ'
-        23: 3,  # 'χ'
-        42: 2,  # 'ψ'
-        24: 3,  # 'ω'
-        19: 3,  # 'ό'
-        26: 0,  # 'Ï'
-        27: 3,  # 'ÏŽ'
-    },
-    11: {  # 'κ'
-        60: 0,  # 'e'
-        55: 0,  # 'o'
-        58: 0,  # 't'
-        36: 0,  # '·'
-        61: 0,  # 'Ά'
-        46: 0,  # 'Έ'
-        54: 0,  # 'Ό'
-        31: 0,  # 'Α'
-        51: 0,  # 'Î’'
-        43: 0,  # 'Γ'
-        41: 0,  # 'Δ'
-        34: 0,  # 'Ε'
-        40: 0,  # 'Η'
-        52: 0,  # 'Θ'
-        47: 0,  # 'Ι'
-        44: 0,  # 'Κ'
-        53: 0,  # 'Λ'
-        38: 0,  # 'Μ'
-        49: 0,  # 'Î'
-        59: 0,  # 'Ξ'
-        39: 0,  # 'Ο'
-        35: 0,  # 'Π'
-        48: 0,  # 'Ρ'
-        37: 0,  # 'Σ'
-        33: 0,  # 'Τ'
-        45: 0,  # 'Î¥'
-        56: 0,  # 'Φ'
-        50: 0,  # 'Χ'
-        57: 0,  # 'Ω'
-        17: 3,  # 'ά'
-        18: 3,  # 'έ'
-        22: 3,  # 'ή'
-        15: 3,  # 'ί'
-        1: 3,  # 'α'
-        29: 0,  # 'β'
-        20: 0,  # 'γ'
-        21: 3,  # 'δ'
-        3: 3,  # 'ε'
-        32: 0,  # 'ζ'
-        13: 3,  # 'η'
-        25: 2,  # 'θ'
-        5: 3,  # 'ι'
-        11: 3,  # 'κ'
-        16: 3,  # 'λ'
-        10: 3,  # 'μ'
-        6: 2,  # 'ν'
-        30: 0,  # 'ξ'
-        4: 3,  # 'ο'
-        9: 2,  # 'Ï€'
-        8: 3,  # 'Ï'
-        14: 0,  # 'Ï‚'
-        7: 0,  # 'σ'
-        2: 3,  # 'Ï„'
-        12: 3,  # 'Ï…'
-        28: 2,  # 'φ'
-        23: 2,  # 'χ'
-        42: 0,  # 'ψ'
-        24: 3,  # 'ω'
-        19: 3,  # 'ό'
-        26: 3,  # 'Ï'
-        27: 3,  # 'ÏŽ'
-    },
-    16: {  # 'λ'
-        60: 0,  # 'e'
-        55: 0,  # 'o'
-        58: 0,  # 't'
-        36: 0,  # '·'
-        61: 0,  # 'Ά'
-        46: 0,  # 'Έ'
-        54: 0,  # 'Ό'
-        31: 0,  # 'Α'
-        51: 0,  # 'Î’'
-        43: 0,  # 'Γ'
-        41: 0,  # 'Δ'
-        34: 0,  # 'Ε'
-        40: 0,  # 'Η'
-        52: 0,  # 'Θ'
-        47: 0,  # 'Ι'
-        44: 0,  # 'Κ'
-        53: 0,  # 'Λ'
-        38: 0,  # 'Μ'
-        49: 0,  # 'Î'
-        59: 0,  # 'Ξ'
-        39: 0,  # 'Ο'
-        35: 0,  # 'Π'
-        48: 0,  # 'Ρ'
-        37: 0,  # 'Σ'
-        33: 0,  # 'Τ'
-        45: 0,  # 'Î¥'
-        56: 0,  # 'Φ'
-        50: 0,  # 'Χ'
-        57: 0,  # 'Ω'
-        17: 3,  # 'ά'
-        18: 3,  # 'έ'
-        22: 3,  # 'ή'
-        15: 3,  # 'ί'
-        1: 3,  # 'α'
-        29: 1,  # 'β'
-        20: 2,  # 'γ'
-        21: 1,  # 'δ'
-        3: 3,  # 'ε'
-        32: 0,  # 'ζ'
-        13: 3,  # 'η'
-        25: 2,  # 'θ'
-        5: 3,  # 'ι'
-        11: 2,  # 'κ'
-        16: 3,  # 'λ'
-        10: 2,  # 'μ'
-        6: 2,  # 'ν'
-        30: 0,  # 'ξ'
-        4: 3,  # 'ο'
-        9: 3,  # 'Ï€'
-        8: 0,  # 'Ï'
-        14: 0,  # 'Ï‚'
-        7: 0,  # 'σ'
-        2: 3,  # 'Ï„'
-        12: 3,  # 'Ï…'
-        28: 2,  # 'φ'
-        23: 0,  # 'χ'
-        42: 0,  # 'ψ'
-        24: 3,  # 'ω'
-        19: 3,  # 'ό'
-        26: 3,  # 'Ï'
-        27: 3,  # 'ÏŽ'
-    },
-    10: {  # 'μ'
-        60: 0,  # 'e'
-        55: 0,  # 'o'
-        58: 0,  # 't'
-        36: 0,  # '·'
-        61: 0,  # 'Ά'
-        46: 0,  # 'Έ'
-        54: 0,  # 'Ό'
-        31: 0,  # 'Α'
-        51: 0,  # 'Î’'
-        43: 0,  # 'Γ'
-        41: 0,  # 'Δ'
-        34: 1,  # 'Ε'
-        40: 0,  # 'Η'
-        52: 0,  # 'Θ'
-        47: 0,  # 'Ι'
-        44: 0,  # 'Κ'
-        53: 0,  # 'Λ'
-        38: 0,  # 'Μ'
-        49: 0,  # 'Î'
-        59: 0,  # 'Ξ'
-        39: 0,  # 'Ο'
-        35: 0,  # 'Π'
-        48: 0,  # 'Ρ'
-        37: 0,  # 'Σ'
-        33: 0,  # 'Τ'
-        45: 0,  # 'Î¥'
-        56: 0,  # 'Φ'
-        50: 0,  # 'Χ'
-        57: 0,  # 'Ω'
-        17: 3,  # 'ά'
-        18: 3,  # 'έ'
-        22: 3,  # 'ή'
-        15: 3,  # 'ί'
-        1: 3,  # 'α'
-        29: 3,  # 'β'
-        20: 0,  # 'γ'
-        21: 0,  # 'δ'
-        3: 3,  # 'ε'
-        32: 0,  # 'ζ'
-        13: 3,  # 'η'
-        25: 0,  # 'θ'
-        5: 3,  # 'ι'
-        11: 0,  # 'κ'
-        16: 0,  # 'λ'
-        10: 3,  # 'μ'
-        6: 3,  # 'ν'
-        30: 0,  # 'ξ'
-        4: 3,  # 'ο'
-        9: 3,  # 'Ï€'
-        8: 0,  # 'Ï'
-        14: 0,  # 'Ï‚'
-        7: 0,  # 'σ'
-        2: 0,  # 'Ï„'
-        12: 2,  # 'Ï…'
-        28: 3,  # 'φ'
-        23: 0,  # 'χ'
-        42: 2,  # 'ψ'
-        24: 3,  # 'ω'
-        19: 3,  # 'ό'
-        26: 2,  # 'Ï'
-        27: 2,  # 'ÏŽ'
-    },
-    6: {  # 'ν'
-        60: 0,  # 'e'
-        55: 0,  # 'o'
-        58: 0,  # 't'
-        36: 2,  # '·'
-        61: 0,  # 'Ά'
-        46: 0,  # 'Έ'
-        54: 0,  # 'Ό'
-        31: 0,  # 'Α'
-        51: 0,  # 'Î’'
-        43: 0,  # 'Γ'
-        41: 0,  # 'Δ'
-        34: 0,  # 'Ε'
-        40: 0,  # 'Η'
-        52: 0,  # 'Θ'
-        47: 0,  # 'Ι'
-        44: 0,  # 'Κ'
-        53: 0,  # 'Λ'
-        38: 0,  # 'Μ'
-        49: 0,  # 'Î'
-        59: 0,  # 'Ξ'
-        39: 0,  # 'Ο'
-        35: 0,  # 'Π'
-        48: 0,  # 'Ρ'
-        37: 0,  # 'Σ'
-        33: 0,  # 'Τ'
-        45: 0,  # 'Î¥'
-        56: 0,  # 'Φ'
-        50: 0,  # 'Χ'
-        57: 0,  # 'Ω'
-        17: 3,  # 'ά'
-        18: 3,  # 'έ'
-        22: 3,  # 'ή'
-        15: 3,  # 'ί'
-        1: 3,  # 'α'
-        29: 0,  # 'β'
-        20: 0,  # 'γ'
-        21: 3,  # 'δ'
-        3: 3,  # 'ε'
-        32: 2,  # 'ζ'
-        13: 3,  # 'η'
-        25: 3,  # 'θ'
-        5: 3,  # 'ι'
-        11: 0,  # 'κ'
-        16: 1,  # 'λ'
-        10: 0,  # 'μ'
-        6: 2,  # 'ν'
-        30: 0,  # 'ξ'
-        4: 3,  # 'ο'
-        9: 0,  # 'Ï€'
-        8: 0,  # 'Ï'
-        14: 0,  # 'Ï‚'
-        7: 3,  # 'σ'
-        2: 3,  # 'Ï„'
-        12: 3,  # 'Ï…'
-        28: 0,  # 'φ'
-        23: 0,  # 'χ'
-        42: 0,  # 'ψ'
-        24: 3,  # 'ω'
-        19: 3,  # 'ό'
-        26: 3,  # 'Ï'
-        27: 3,  # 'ÏŽ'
-    },
-    30: {  # 'ξ'
-        60: 0,  # 'e'
-        55: 0,  # 'o'
-        58: 0,  # 't'
-        36: 0,  # '·'
-        61: 0,  # 'Ά'
-        46: 0,  # 'Έ'
-        54: 0,  # 'Ό'
-        31: 0,  # 'Α'
-        51: 0,  # 'Î’'
-        43: 0,  # 'Γ'
-        41: 0,  # 'Δ'
-        34: 0,  # 'Ε'
-        40: 0,  # 'Η'
-        52: 0,  # 'Θ'
-        47: 0,  # 'Ι'
-        44: 0,  # 'Κ'
-        53: 0,  # 'Λ'
-        38: 0,  # 'Μ'
-        49: 0,  # 'Î'
-        59: 0,  # 'Ξ'
-        39: 0,  # 'Ο'
-        35: 0,  # 'Π'
-        48: 0,  # 'Ρ'
-        37: 0,  # 'Σ'
-        33: 0,  # 'Τ'
-        45: 0,  # 'Î¥'
-        56: 0,  # 'Φ'
-        50: 0,  # 'Χ'
-        57: 0,  # 'Ω'
-        17: 2,  # 'ά'
-        18: 3,  # 'έ'
-        22: 3,  # 'ή'
-        15: 2,  # 'ί'
-        1: 3,  # 'α'
-        29: 0,  # 'β'
-        20: 0,  # 'γ'
-        21: 0,  # 'δ'
-        3: 3,  # 'ε'
-        32: 0,  # 'ζ'
-        13: 3,  # 'η'
-        25: 0,  # 'θ'
-        5: 2,  # 'ι'
-        11: 0,  # 'κ'
-        16: 0,  # 'λ'
-        10: 0,  # 'μ'
-        6: 0,  # 'ν'
-        30: 0,  # 'ξ'
-        4: 3,  # 'ο'
-        9: 0,  # 'Ï€'
-        8: 0,  # 'Ï'
-        14: 0,  # 'Ï‚'
-        7: 0,  # 'σ'
-        2: 3,  # 'Ï„'
-        12: 2,  # 'Ï…'
-        28: 0,  # 'φ'
-        23: 0,  # 'χ'
-        42: 0,  # 'ψ'
-        24: 3,  # 'ω'
-        19: 2,  # 'ό'
-        26: 3,  # 'Ï'
-        27: 1,  # 'ÏŽ'
-    },
-    4: {  # 'ο'
-        60: 0,  # 'e'
-        55: 0,  # 'o'
-        58: 0,  # 't'
-        36: 2,  # '·'
-        61: 0,  # 'Ά'
-        46: 0,  # 'Έ'
-        54: 0,  # 'Ό'
-        31: 0,  # 'Α'
-        51: 0,  # 'Î’'
-        43: 0,  # 'Γ'
-        41: 0,  # 'Δ'
-        34: 0,  # 'Ε'
-        40: 0,  # 'Η'
-        52: 0,  # 'Θ'
-        47: 0,  # 'Ι'
-        44: 0,  # 'Κ'
-        53: 0,  # 'Λ'
-        38: 0,  # 'Μ'
-        49: 0,  # 'Î'
-        59: 0,  # 'Ξ'
-        39: 0,  # 'Ο'
-        35: 0,  # 'Π'
-        48: 0,  # 'Ρ'
-        37: 0,  # 'Σ'
-        33: 0,  # 'Τ'
-        45: 0,  # 'Î¥'
-        56: 0,  # 'Φ'
-        50: 0,  # 'Χ'
-        57: 0,  # 'Ω'
-        17: 0,  # 'ά'
-        18: 2,  # 'έ'
-        22: 3,  # 'ή'
-        15: 3,  # 'ί'
-        1: 2,  # 'α'
-        29: 3,  # 'β'
-        20: 3,  # 'γ'
-        21: 3,  # 'δ'
-        3: 3,  # 'ε'
-        32: 0,  # 'ζ'
-        13: 3,  # 'η'
-        25: 3,  # 'θ'
-        5: 3,  # 'ι'
-        11: 3,  # 'κ'
-        16: 3,  # 'λ'
-        10: 3,  # 'μ'
-        6: 3,  # 'ν'
-        30: 2,  # 'ξ'
-        4: 2,  # 'ο'
-        9: 3,  # 'Ï€'
-        8: 3,  # 'Ï'
-        14: 3,  # 'Ï‚'
-        7: 3,  # 'σ'
-        2: 3,  # 'Ï„'
-        12: 3,  # 'Ï…'
-        28: 3,  # 'φ'
-        23: 3,  # 'χ'
-        42: 2,  # 'ψ'
-        24: 2,  # 'ω'
-        19: 1,  # 'ό'
-        26: 3,  # 'Ï'
-        27: 2,  # 'ÏŽ'
-    },
-    9: {  # 'Ï€'
-        60: 0,  # 'e'
-        55: 0,  # 'o'
-        58: 0,  # 't'
-        36: 0,  # '·'
-        61: 0,  # 'Ά'
-        46: 0,  # 'Έ'
-        54: 0,  # 'Ό'
-        31: 0,  # 'Α'
-        51: 0,  # 'Î’'
-        43: 0,  # 'Γ'
-        41: 0,  # 'Δ'
-        34: 0,  # 'Ε'
-        40: 0,  # 'Η'
-        52: 0,  # 'Θ'
-        47: 0,  # 'Ι'
-        44: 0,  # 'Κ'
-        53: 0,  # 'Λ'
-        38: 0,  # 'Μ'
-        49: 0,  # 'Î'
-        59: 0,  # 'Ξ'
-        39: 0,  # 'Ο'
-        35: 0,  # 'Π'
-        48: 0,  # 'Ρ'
-        37: 0,  # 'Σ'
-        33: 0,  # 'Τ'
-        45: 0,  # 'Î¥'
-        56: 0,  # 'Φ'
-        50: 0,  # 'Χ'
-        57: 0,  # 'Ω'
-        17: 3,  # 'ά'
-        18: 3,  # 'έ'
-        22: 3,  # 'ή'
-        15: 3,  # 'ί'
-        1: 3,  # 'α'
-        29: 0,  # 'β'
-        20: 0,  # 'γ'
-        21: 0,  # 'δ'
-        3: 3,  # 'ε'
-        32: 0,  # 'ζ'
-        13: 3,  # 'η'
-        25: 0,  # 'θ'
-        5: 3,  # 'ι'
-        11: 0,  # 'κ'
-        16: 3,  # 'λ'
-        10: 0,  # 'μ'
-        6: 2,  # 'ν'
-        30: 0,  # 'ξ'
-        4: 3,  # 'ο'
-        9: 0,  # 'Ï€'
-        8: 3,  # 'Ï'
-        14: 2,  # 'Ï‚'
-        7: 0,  # 'σ'
-        2: 3,  # 'Ï„'
-        12: 3,  # 'Ï…'
-        28: 0,  # 'φ'
-        23: 2,  # 'χ'
-        42: 0,  # 'ψ'
-        24: 3,  # 'ω'
-        19: 3,  # 'ό'
-        26: 2,  # 'Ï'
-        27: 3,  # 'ÏŽ'
-    },
-    8: {  # 'Ï'
-        60: 0,  # 'e'
-        55: 0,  # 'o'
-        58: 0,  # 't'
-        36: 0,  # '·'
-        61: 0,  # 'Ά'
-        46: 0,  # 'Έ'
-        54: 0,  # 'Ό'
-        31: 0,  # 'Α'
-        51: 0,  # 'Î’'
-        43: 0,  # 'Γ'
-        41: 0,  # 'Δ'
-        34: 0,  # 'Ε'
-        40: 0,  # 'Η'
-        52: 0,  # 'Θ'
-        47: 0,  # 'Ι'
-        44: 0,  # 'Κ'
-        53: 0,  # 'Λ'
-        38: 0,  # 'Μ'
-        49: 0,  # 'Î'
-        59: 0,  # 'Ξ'
-        39: 0,  # 'Ο'
-        35: 0,  # 'Π'
-        48: 0,  # 'Ρ'
-        37: 0,  # 'Σ'
-        33: 0,  # 'Τ'
-        45: 0,  # 'Î¥'
-        56: 0,  # 'Φ'
-        50: 0,  # 'Χ'
-        57: 0,  # 'Ω'
-        17: 3,  # 'ά'
-        18: 3,  # 'έ'
-        22: 3,  # 'ή'
-        15: 3,  # 'ί'
-        1: 3,  # 'α'
-        29: 2,  # 'β'
-        20: 3,  # 'γ'
-        21: 2,  # 'δ'
-        3: 3,  # 'ε'
-        32: 0,  # 'ζ'
-        13: 3,  # 'η'
-        25: 3,  # 'θ'
-        5: 3,  # 'ι'
-        11: 3,  # 'κ'
-        16: 1,  # 'λ'
-        10: 3,  # 'μ'
-        6: 3,  # 'ν'
-        30: 2,  # 'ξ'
-        4: 3,  # 'ο'
-        9: 2,  # 'Ï€'
-        8: 2,  # 'Ï'
-        14: 0,  # 'Ï‚'
-        7: 2,  # 'σ'
-        2: 3,  # 'Ï„'
-        12: 3,  # 'Ï…'
-        28: 3,  # 'φ'
-        23: 3,  # 'χ'
-        42: 0,  # 'ψ'
-        24: 3,  # 'ω'
-        19: 3,  # 'ό'
-        26: 3,  # 'Ï'
-        27: 3,  # 'ÏŽ'
-    },
-    14: {  # 'Ï‚'
-        60: 0,  # 'e'
-        55: 0,  # 'o'
-        58: 0,  # 't'
-        36: 2,  # '·'
-        61: 0,  # 'Ά'
-        46: 0,  # 'Έ'
-        54: 0,  # 'Ό'
-        31: 0,  # 'Α'
-        51: 0,  # 'Î’'
-        43: 0,  # 'Γ'
-        41: 0,  # 'Δ'
-        34: 0,  # 'Ε'
-        40: 0,  # 'Η'
-        52: 0,  # 'Θ'
-        47: 0,  # 'Ι'
-        44: 0,  # 'Κ'
-        53: 0,  # 'Λ'
-        38: 0,  # 'Μ'
-        49: 0,  # 'Î'
-        59: 0,  # 'Ξ'
-        39: 0,  # 'Ο'
-        35: 0,  # 'Π'
-        48: 0,  # 'Ρ'
-        37: 0,  # 'Σ'
-        33: 0,  # 'Τ'
-        45: 0,  # 'Î¥'
-        56: 0,  # 'Φ'
-        50: 0,  # 'Χ'
-        57: 0,  # 'Ω'
-        17: 0,  # 'ά'
-        18: 0,  # 'έ'
-        22: 0,  # 'ή'
-        15: 0,  # 'ί'
-        1: 0,  # 'α'
-        29: 0,  # 'β'
-        20: 0,  # 'γ'
-        21: 0,  # 'δ'
-        3: 0,  # 'ε'
-        32: 0,  # 'ζ'
-        13: 0,  # 'η'
-        25: 0,  # 'θ'
-        5: 0,  # 'ι'
-        11: 0,  # 'κ'
-        16: 0,  # 'λ'
-        10: 0,  # 'μ'
-        6: 0,  # 'ν'
-        30: 0,  # 'ξ'
-        4: 0,  # 'ο'
-        9: 0,  # 'Ï€'
-        8: 0,  # 'Ï'
-        14: 0,  # 'Ï‚'
-        7: 0,  # 'σ'
-        2: 0,  # 'Ï„'
-        12: 0,  # 'Ï…'
-        28: 0,  # 'φ'
-        23: 0,  # 'χ'
-        42: 0,  # 'ψ'
-        24: 0,  # 'ω'
-        19: 0,  # 'ό'
-        26: 0,  # 'Ï'
-        27: 0,  # 'ÏŽ'
-    },
-    7: {  # 'σ'
-        60: 0,  # 'e'
-        55: 0,  # 'o'
-        58: 0,  # 't'
-        36: 0,  # '·'
-        61: 0,  # 'Ά'
-        46: 0,  # 'Έ'
-        54: 0,  # 'Ό'
-        31: 0,  # 'Α'
-        51: 0,  # 'Î’'
-        43: 0,  # 'Γ'
-        41: 0,  # 'Δ'
-        34: 0,  # 'Ε'
-        40: 0,  # 'Η'
-        52: 0,  # 'Θ'
-        47: 0,  # 'Ι'
-        44: 0,  # 'Κ'
-        53: 0,  # 'Λ'
-        38: 0,  # 'Μ'
-        49: 0,  # 'Î'
-        59: 0,  # 'Ξ'
-        39: 0,  # 'Ο'
-        35: 0,  # 'Π'
-        48: 0,  # 'Ρ'
-        37: 0,  # 'Σ'
-        33: 0,  # 'Τ'
-        45: 0,  # 'Î¥'
-        56: 0,  # 'Φ'
-        50: 0,  # 'Χ'
-        57: 0,  # 'Ω'
-        17: 2,  # 'ά'
-        18: 2,  # 'έ'
-        22: 3,  # 'ή'
-        15: 3,  # 'ί'
-        1: 3,  # 'α'
-        29: 3,  # 'β'
-        20: 0,  # 'γ'
-        21: 2,  # 'δ'
-        3: 3,  # 'ε'
-        32: 0,  # 'ζ'
-        13: 3,  # 'η'
-        25: 3,  # 'θ'
-        5: 3,  # 'ι'
-        11: 3,  # 'κ'
-        16: 2,  # 'λ'
-        10: 3,  # 'μ'
-        6: 0,  # 'ν'
-        30: 0,  # 'ξ'
-        4: 3,  # 'ο'
-        9: 3,  # 'Ï€'
-        8: 0,  # 'Ï'
-        14: 0,  # 'Ï‚'
-        7: 3,  # 'σ'
-        2: 3,  # 'Ï„'
-        12: 3,  # 'Ï…'
-        28: 3,  # 'φ'
-        23: 3,  # 'χ'
-        42: 0,  # 'ψ'
-        24: 3,  # 'ω'
-        19: 3,  # 'ό'
-        26: 3,  # 'Ï'
-        27: 2,  # 'ÏŽ'
-    },
-    2: {  # 'Ï„'
-        60: 0,  # 'e'
-        55: 2,  # 'o'
-        58: 0,  # 't'
-        36: 0,  # '·'
-        61: 0,  # 'Ά'
-        46: 0,  # 'Έ'
-        54: 0,  # 'Ό'
-        31: 0,  # 'Α'
-        51: 0,  # 'Î’'
-        43: 0,  # 'Γ'
-        41: 0,  # 'Δ'
-        34: 0,  # 'Ε'
-        40: 0,  # 'Η'
-        52: 0,  # 'Θ'
-        47: 0,  # 'Ι'
-        44: 0,  # 'Κ'
-        53: 0,  # 'Λ'
-        38: 0,  # 'Μ'
-        49: 0,  # 'Î'
-        59: 0,  # 'Ξ'
-        39: 0,  # 'Ο'
-        35: 0,  # 'Π'
-        48: 0,  # 'Ρ'
-        37: 0,  # 'Σ'
-        33: 0,  # 'Τ'
-        45: 0,  # 'Î¥'
-        56: 0,  # 'Φ'
-        50: 0,  # 'Χ'
-        57: 0,  # 'Ω'
-        17: 3,  # 'ά'
-        18: 3,  # 'έ'
-        22: 3,  # 'ή'
-        15: 3,  # 'ί'
-        1: 3,  # 'α'
-        29: 0,  # 'β'
-        20: 0,  # 'γ'
-        21: 0,  # 'δ'
-        3: 3,  # 'ε'
-        32: 2,  # 'ζ'
-        13: 3,  # 'η'
-        25: 0,  # 'θ'
-        5: 3,  # 'ι'
-        11: 2,  # 'κ'
-        16: 2,  # 'λ'
-        10: 3,  # 'μ'
-        6: 0,  # 'ν'
-        30: 0,  # 'ξ'
-        4: 3,  # 'ο'
-        9: 0,  # 'Ï€'
-        8: 3,  # 'Ï'
-        14: 0,  # 'Ï‚'
-        7: 3,  # 'σ'
-        2: 3,  # 'Ï„'
-        12: 3,  # 'Ï…'
-        28: 2,  # 'φ'
-        23: 0,  # 'χ'
-        42: 0,  # 'ψ'
-        24: 3,  # 'ω'
-        19: 3,  # 'ό'
-        26: 3,  # 'Ï'
-        27: 3,  # 'ÏŽ'
-    },
-    12: {  # 'Ï…'
-        60: 0,  # 'e'
-        55: 0,  # 'o'
-        58: 0,  # 't'
-        36: 0,  # '·'
-        61: 0,  # 'Ά'
-        46: 0,  # 'Έ'
-        54: 0,  # 'Ό'
-        31: 0,  # 'Α'
-        51: 0,  # 'Î’'
-        43: 0,  # 'Γ'
-        41: 0,  # 'Δ'
-        34: 0,  # 'Ε'
-        40: 0,  # 'Η'
-        52: 0,  # 'Θ'
-        47: 0,  # 'Ι'
-        44: 0,  # 'Κ'
-        53: 0,  # 'Λ'
-        38: 0,  # 'Μ'
-        49: 0,  # 'Î'
-        59: 0,  # 'Ξ'
-        39: 0,  # 'Ο'
-        35: 0,  # 'Π'
-        48: 0,  # 'Ρ'
-        37: 0,  # 'Σ'
-        33: 0,  # 'Τ'
-        45: 0,  # 'Î¥'
-        56: 0,  # 'Φ'
-        50: 0,  # 'Χ'
-        57: 0,  # 'Ω'
-        17: 2,  # 'ά'
-        18: 2,  # 'έ'
-        22: 3,  # 'ή'
-        15: 2,  # 'ί'
-        1: 3,  # 'α'
-        29: 2,  # 'β'
-        20: 3,  # 'γ'
-        21: 2,  # 'δ'
-        3: 2,  # 'ε'
-        32: 2,  # 'ζ'
-        13: 2,  # 'η'
-        25: 3,  # 'θ'
-        5: 2,  # 'ι'
-        11: 3,  # 'κ'
-        16: 3,  # 'λ'
-        10: 3,  # 'μ'
-        6: 3,  # 'ν'
-        30: 3,  # 'ξ'
-        4: 3,  # 'ο'
-        9: 3,  # 'Ï€'
-        8: 3,  # 'Ï'
-        14: 3,  # 'Ï‚'
-        7: 3,  # 'σ'
-        2: 3,  # 'Ï„'
-        12: 0,  # 'Ï…'
-        28: 2,  # 'φ'
-        23: 3,  # 'χ'
-        42: 2,  # 'ψ'
-        24: 2,  # 'ω'
-        19: 2,  # 'ό'
-        26: 0,  # 'Ï'
-        27: 2,  # 'ÏŽ'
-    },
-    28: {  # 'φ'
-        60: 0,  # 'e'
-        55: 0,  # 'o'
-        58: 0,  # 't'
-        36: 0,  # '·'
-        61: 0,  # 'Ά'
-        46: 0,  # 'Έ'
-        54: 0,  # 'Ό'
-        31: 0,  # 'Α'
-        51: 0,  # 'Î’'
-        43: 0,  # 'Γ'
-        41: 0,  # 'Δ'
-        34: 0,  # 'Ε'
-        40: 0,  # 'Η'
-        52: 0,  # 'Θ'
-        47: 0,  # 'Ι'
-        44: 0,  # 'Κ'
-        53: 0,  # 'Λ'
-        38: 0,  # 'Μ'
-        49: 0,  # 'Î'
-        59: 0,  # 'Ξ'
-        39: 0,  # 'Ο'
-        35: 0,  # 'Π'
-        48: 0,  # 'Ρ'
-        37: 0,  # 'Σ'
-        33: 0,  # 'Τ'
-        45: 0,  # 'Î¥'
-        56: 0,  # 'Φ'
-        50: 0,  # 'Χ'
-        57: 0,  # 'Ω'
-        17: 3,  # 'ά'
-        18: 3,  # 'έ'
-        22: 3,  # 'ή'
-        15: 3,  # 'ί'
-        1: 3,  # 'α'
-        29: 0,  # 'β'
-        20: 0,  # 'γ'
-        21: 0,  # 'δ'
-        3: 3,  # 'ε'
-        32: 0,  # 'ζ'
-        13: 2,  # 'η'
-        25: 2,  # 'θ'
-        5: 3,  # 'ι'
-        11: 0,  # 'κ'
-        16: 2,  # 'λ'
-        10: 0,  # 'μ'
-        6: 1,  # 'ν'
-        30: 0,  # 'ξ'
-        4: 3,  # 'ο'
-        9: 0,  # 'Ï€'
-        8: 3,  # 'Ï'
-        14: 0,  # 'Ï‚'
-        7: 0,  # 'σ'
-        2: 3,  # 'Ï„'
-        12: 3,  # 'Ï…'
-        28: 1,  # 'φ'
-        23: 0,  # 'χ'
-        42: 0,  # 'ψ'
-        24: 3,  # 'ω'
-        19: 3,  # 'ό'
-        26: 2,  # 'Ï'
-        27: 2,  # 'ÏŽ'
-    },
-    23: {  # 'χ'
-        60: 0,  # 'e'
-        55: 0,  # 'o'
-        58: 0,  # 't'
-        36: 0,  # '·'
-        61: 0,  # 'Ά'
-        46: 0,  # 'Έ'
-        54: 0,  # 'Ό'
-        31: 0,  # 'Α'
-        51: 0,  # 'Î’'
-        43: 0,  # 'Γ'
-        41: 0,  # 'Δ'
-        34: 0,  # 'Ε'
-        40: 0,  # 'Η'
-        52: 0,  # 'Θ'
-        47: 0,  # 'Ι'
-        44: 0,  # 'Κ'
-        53: 0,  # 'Λ'
-        38: 0,  # 'Μ'
-        49: 0,  # 'Î'
-        59: 0,  # 'Ξ'
-        39: 0,  # 'Ο'
-        35: 0,  # 'Π'
-        48: 0,  # 'Ρ'
-        37: 0,  # 'Σ'
-        33: 0,  # 'Τ'
-        45: 0,  # 'Î¥'
-        56: 0,  # 'Φ'
-        50: 0,  # 'Χ'
-        57: 0,  # 'Ω'
-        17: 3,  # 'ά'
-        18: 2,  # 'έ'
-        22: 3,  # 'ή'
-        15: 3,  # 'ί'
-        1: 3,  # 'α'
-        29: 0,  # 'β'
-        20: 0,  # 'γ'
-        21: 0,  # 'δ'
-        3: 3,  # 'ε'
-        32: 0,  # 'ζ'
-        13: 2,  # 'η'
-        25: 2,  # 'θ'
-        5: 3,  # 'ι'
-        11: 0,  # 'κ'
-        16: 2,  # 'λ'
-        10: 2,  # 'μ'
-        6: 3,  # 'ν'
-        30: 0,  # 'ξ'
-        4: 3,  # 'ο'
-        9: 0,  # 'Ï€'
-        8: 3,  # 'Ï'
-        14: 0,  # 'Ï‚'
-        7: 0,  # 'σ'
-        2: 3,  # 'Ï„'
-        12: 3,  # 'Ï…'
-        28: 0,  # 'φ'
-        23: 2,  # 'χ'
-        42: 0,  # 'ψ'
-        24: 3,  # 'ω'
-        19: 3,  # 'ό'
-        26: 3,  # 'Ï'
-        27: 3,  # 'ÏŽ'
-    },
-    42: {  # 'ψ'
-        60: 0,  # 'e'
-        55: 0,  # 'o'
-        58: 0,  # 't'
-        36: 0,  # '·'
-        61: 0,  # 'Ά'
-        46: 0,  # 'Έ'
-        54: 0,  # 'Ό'
-        31: 0,  # 'Α'
-        51: 0,  # 'Î’'
-        43: 0,  # 'Γ'
-        41: 0,  # 'Δ'
-        34: 0,  # 'Ε'
-        40: 0,  # 'Η'
-        52: 0,  # 'Θ'
-        47: 0,  # 'Ι'
-        44: 0,  # 'Κ'
-        53: 0,  # 'Λ'
-        38: 0,  # 'Μ'
-        49: 0,  # 'Î'
-        59: 0,  # 'Ξ'
-        39: 0,  # 'Ο'
-        35: 0,  # 'Π'
-        48: 0,  # 'Ρ'
-        37: 0,  # 'Σ'
-        33: 0,  # 'Τ'
-        45: 0,  # 'Î¥'
-        56: 0,  # 'Φ'
-        50: 0,  # 'Χ'
-        57: 0,  # 'Ω'
-        17: 2,  # 'ά'
-        18: 2,  # 'έ'
-        22: 1,  # 'ή'
-        15: 2,  # 'ί'
-        1: 2,  # 'α'
-        29: 0,  # 'β'
-        20: 0,  # 'γ'
-        21: 0,  # 'δ'
-        3: 3,  # 'ε'
-        32: 0,  # 'ζ'
-        13: 3,  # 'η'
-        25: 0,  # 'θ'
-        5: 2,  # 'ι'
-        11: 0,  # 'κ'
-        16: 0,  # 'λ'
-        10: 0,  # 'μ'
-        6: 0,  # 'ν'
-        30: 0,  # 'ξ'
-        4: 2,  # 'ο'
-        9: 0,  # 'Ï€'
-        8: 0,  # 'Ï'
-        14: 0,  # 'Ï‚'
-        7: 0,  # 'σ'
-        2: 2,  # 'Ï„'
-        12: 1,  # 'Ï…'
-        28: 0,  # 'φ'
-        23: 0,  # 'χ'
-        42: 0,  # 'ψ'
-        24: 2,  # 'ω'
-        19: 0,  # 'ό'
-        26: 0,  # 'Ï'
-        27: 0,  # 'ÏŽ'
-    },
-    24: {  # 'ω'
-        60: 0,  # 'e'
-        55: 0,  # 'o'
-        58: 0,  # 't'
-        36: 0,  # '·'
-        61: 0,  # 'Ά'
-        46: 0,  # 'Έ'
-        54: 0,  # 'Ό'
-        31: 0,  # 'Α'
-        51: 0,  # 'Î’'
-        43: 0,  # 'Γ'
-        41: 0,  # 'Δ'
-        34: 0,  # 'Ε'
-        40: 0,  # 'Η'
-        52: 0,  # 'Θ'
-        47: 0,  # 'Ι'
-        44: 0,  # 'Κ'
-        53: 0,  # 'Λ'
-        38: 0,  # 'Μ'
-        49: 0,  # 'Î'
-        59: 0,  # 'Ξ'
-        39: 0,  # 'Ο'
-        35: 0,  # 'Π'
-        48: 0,  # 'Ρ'
-        37: 0,  # 'Σ'
-        33: 0,  # 'Τ'
-        45: 0,  # 'Î¥'
-        56: 0,  # 'Φ'
-        50: 0,  # 'Χ'
-        57: 0,  # 'Ω'
-        17: 1,  # 'ά'
-        18: 0,  # 'έ'
-        22: 2,  # 'ή'
-        15: 0,  # 'ί'
-        1: 0,  # 'α'
-        29: 2,  # 'β'
-        20: 3,  # 'γ'
-        21: 2,  # 'δ'
-        3: 0,  # 'ε'
-        32: 0,  # 'ζ'
-        13: 0,  # 'η'
-        25: 3,  # 'θ'
-        5: 2,  # 'ι'
-        11: 0,  # 'κ'
-        16: 2,  # 'λ'
-        10: 3,  # 'μ'
-        6: 3,  # 'ν'
-        30: 0,  # 'ξ'
-        4: 0,  # 'ο'
-        9: 3,  # 'Ï€'
-        8: 3,  # 'Ï'
-        14: 3,  # 'Ï‚'
-        7: 3,  # 'σ'
-        2: 3,  # 'Ï„'
-        12: 0,  # 'Ï…'
-        28: 2,  # 'φ'
-        23: 2,  # 'χ'
-        42: 0,  # 'ψ'
-        24: 0,  # 'ω'
-        19: 0,  # 'ό'
-        26: 0,  # 'Ï'
-        27: 0,  # 'ÏŽ'
-    },
-    19: {  # 'ό'
-        60: 0,  # 'e'
-        55: 0,  # 'o'
-        58: 0,  # 't'
-        36: 0,  # '·'
-        61: 0,  # 'Ά'
-        46: 0,  # 'Έ'
-        54: 0,  # 'Ό'
-        31: 0,  # 'Α'
-        51: 0,  # 'Î’'
-        43: 0,  # 'Γ'
-        41: 0,  # 'Δ'
-        34: 0,  # 'Ε'
-        40: 0,  # 'Η'
-        52: 0,  # 'Θ'
-        47: 0,  # 'Ι'
-        44: 0,  # 'Κ'
-        53: 0,  # 'Λ'
-        38: 0,  # 'Μ'
-        49: 0,  # 'Î'
-        59: 0,  # 'Ξ'
-        39: 0,  # 'Ο'
-        35: 0,  # 'Π'
-        48: 0,  # 'Ρ'
-        37: 0,  # 'Σ'
-        33: 0,  # 'Τ'
-        45: 0,  # 'Î¥'
-        56: 0,  # 'Φ'
-        50: 0,  # 'Χ'
-        57: 0,  # 'Ω'
-        17: 0,  # 'ά'
-        18: 0,  # 'έ'
-        22: 0,  # 'ή'
-        15: 0,  # 'ί'
-        1: 0,  # 'α'
-        29: 3,  # 'β'
-        20: 3,  # 'γ'
-        21: 3,  # 'δ'
-        3: 1,  # 'ε'
-        32: 2,  # 'ζ'
-        13: 2,  # 'η'
-        25: 2,  # 'θ'
-        5: 2,  # 'ι'
-        11: 3,  # 'κ'
-        16: 3,  # 'λ'
-        10: 3,  # 'μ'
-        6: 3,  # 'ν'
-        30: 1,  # 'ξ'
-        4: 2,  # 'ο'
-        9: 3,  # 'Ï€'
-        8: 3,  # 'Ï'
-        14: 3,  # 'Ï‚'
-        7: 3,  # 'σ'
-        2: 3,  # 'Ï„'
-        12: 0,  # 'Ï…'
-        28: 2,  # 'φ'
-        23: 3,  # 'χ'
-        42: 2,  # 'ψ'
-        24: 0,  # 'ω'
-        19: 0,  # 'ό'
-        26: 0,  # 'Ï'
-        27: 0,  # 'ÏŽ'
-    },
-    26: {  # 'Ï'
-        60: 0,  # 'e'
-        55: 0,  # 'o'
-        58: 0,  # 't'
-        36: 0,  # '·'
-        61: 0,  # 'Ά'
-        46: 0,  # 'Έ'
-        54: 0,  # 'Ό'
-        31: 0,  # 'Α'
-        51: 0,  # 'Î’'
-        43: 0,  # 'Γ'
-        41: 0,  # 'Δ'
-        34: 0,  # 'Ε'
-        40: 0,  # 'Η'
-        52: 0,  # 'Θ'
-        47: 0,  # 'Ι'
-        44: 0,  # 'Κ'
-        53: 0,  # 'Λ'
-        38: 0,  # 'Μ'
-        49: 0,  # 'Î'
-        59: 0,  # 'Ξ'
-        39: 0,  # 'Ο'
-        35: 0,  # 'Π'
-        48: 0,  # 'Ρ'
-        37: 0,  # 'Σ'
-        33: 0,  # 'Τ'
-        45: 0,  # 'Î¥'
-        56: 0,  # 'Φ'
-        50: 0,  # 'Χ'
-        57: 0,  # 'Ω'
-        17: 0,  # 'ά'
-        18: 0,  # 'έ'
-        22: 0,  # 'ή'
-        15: 0,  # 'ί'
-        1: 2,  # 'α'
-        29: 2,  # 'β'
-        20: 2,  # 'γ'
-        21: 1,  # 'δ'
-        3: 3,  # 'ε'
-        32: 0,  # 'ζ'
-        13: 2,  # 'η'
-        25: 3,  # 'θ'
-        5: 0,  # 'ι'
-        11: 3,  # 'κ'
-        16: 3,  # 'λ'
-        10: 3,  # 'μ'
-        6: 3,  # 'ν'
-        30: 2,  # 'ξ'
-        4: 3,  # 'ο'
-        9: 3,  # 'Ï€'
-        8: 3,  # 'Ï'
-        14: 3,  # 'Ï‚'
-        7: 3,  # 'σ'
-        2: 3,  # 'Ï„'
-        12: 0,  # 'Ï…'
-        28: 2,  # 'φ'
-        23: 2,  # 'χ'
-        42: 2,  # 'ψ'
-        24: 2,  # 'ω'
-        19: 0,  # 'ό'
-        26: 0,  # 'Ï'
-        27: 0,  # 'ÏŽ'
-    },
-    27: {  # 'ÏŽ'
-        60: 0,  # 'e'
-        55: 0,  # 'o'
-        58: 0,  # 't'
-        36: 0,  # '·'
-        61: 0,  # 'Ά'
-        46: 0,  # 'Έ'
-        54: 0,  # 'Ό'
-        31: 0,  # 'Α'
-        51: 0,  # 'Î’'
-        43: 0,  # 'Γ'
-        41: 0,  # 'Δ'
-        34: 0,  # 'Ε'
-        40: 0,  # 'Η'
-        52: 0,  # 'Θ'
-        47: 0,  # 'Ι'
-        44: 0,  # 'Κ'
-        53: 0,  # 'Λ'
-        38: 0,  # 'Μ'
-        49: 0,  # 'Î'
-        59: 0,  # 'Ξ'
-        39: 0,  # 'Ο'
-        35: 0,  # 'Π'
-        48: 0,  # 'Ρ'
-        37: 0,  # 'Σ'
-        33: 0,  # 'Τ'
-        45: 0,  # 'Î¥'
-        56: 0,  # 'Φ'
-        50: 0,  # 'Χ'
-        57: 0,  # 'Ω'
-        17: 0,  # 'ά'
-        18: 0,  # 'έ'
-        22: 0,  # 'ή'
-        15: 0,  # 'ί'
-        1: 0,  # 'α'
-        29: 1,  # 'β'
-        20: 0,  # 'γ'
-        21: 3,  # 'δ'
-        3: 0,  # 'ε'
-        32: 0,  # 'ζ'
-        13: 1,  # 'η'
-        25: 2,  # 'θ'
-        5: 2,  # 'ι'
-        11: 0,  # 'κ'
-        16: 2,  # 'λ'
-        10: 3,  # 'μ'
-        6: 3,  # 'ν'
-        30: 1,  # 'ξ'
-        4: 0,  # 'ο'
-        9: 2,  # 'Ï€'
-        8: 3,  # 'Ï'
-        14: 3,  # 'Ï‚'
-        7: 3,  # 'σ'
-        2: 3,  # 'Ï„'
-        12: 0,  # 'Ï…'
-        28: 1,  # 'φ'
-        23: 1,  # 'χ'
-        42: 0,  # 'ψ'
-        24: 0,  # 'ω'
-        19: 0,  # 'ό'
-        26: 0,  # 'Ï'
-        27: 0,  # 'ÏŽ'
-    },
-}
-
-# 255: Undefined characters that did not exist in training text
-# 254: Carriage/Return
-# 253: symbol (punctuation) that does not belong to word
-# 252: 0 - 9
-# 251: Control characters
-
-# Character Mapping Table(s):
-WINDOWS_1253_GREEK_CHAR_TO_ORDER = {
-     0: 255,  # '\x00'
-     1: 255,  # '\x01'
-     2: 255,  # '\x02'
-     3: 255,  # '\x03'
-     4: 255,  # '\x04'
-     5: 255,  # '\x05'
-     6: 255,  # '\x06'
-     7: 255,  # '\x07'
-     8: 255,  # '\x08'
-     9: 255,  # '\t'
-     10: 254,  # '\n'
-     11: 255,  # '\x0b'
-     12: 255,  # '\x0c'
-     13: 254,  # '\r'
-     14: 255,  # '\x0e'
-     15: 255,  # '\x0f'
-     16: 255,  # '\x10'
-     17: 255,  # '\x11'
-     18: 255,  # '\x12'
-     19: 255,  # '\x13'
-     20: 255,  # '\x14'
-     21: 255,  # '\x15'
-     22: 255,  # '\x16'
-     23: 255,  # '\x17'
-     24: 255,  # '\x18'
-     25: 255,  # '\x19'
-     26: 255,  # '\x1a'
-     27: 255,  # '\x1b'
-     28: 255,  # '\x1c'
-     29: 255,  # '\x1d'
-     30: 255,  # '\x1e'
-     31: 255,  # '\x1f'
-     32: 253,  # ' '
-     33: 253,  # '!'
-     34: 253,  # '"'
-     35: 253,  # '#'
-     36: 253,  # '$'
-     37: 253,  # '%'
-     38: 253,  # '&'
-     39: 253,  # "'"
-     40: 253,  # '('
-     41: 253,  # ')'
-     42: 253,  # '*'
-     43: 253,  # '+'
-     44: 253,  # ','
-     45: 253,  # '-'
-     46: 253,  # '.'
-     47: 253,  # '/'
-     48: 252,  # '0'
-     49: 252,  # '1'
-     50: 252,  # '2'
-     51: 252,  # '3'
-     52: 252,  # '4'
-     53: 252,  # '5'
-     54: 252,  # '6'
-     55: 252,  # '7'
-     56: 252,  # '8'
-     57: 252,  # '9'
-     58: 253,  # ':'
-     59: 253,  # ';'
-     60: 253,  # '<'
-     61: 253,  # '='
-     62: 253,  # '>'
-     63: 253,  # '?'
-     64: 253,  # '@'
-     65: 82,  # 'A'
-     66: 100,  # 'B'
-     67: 104,  # 'C'
-     68: 94,  # 'D'
-     69: 98,  # 'E'
-     70: 101,  # 'F'
-     71: 116,  # 'G'
-     72: 102,  # 'H'
-     73: 111,  # 'I'
-     74: 187,  # 'J'
-     75: 117,  # 'K'
-     76: 92,  # 'L'
-     77: 88,  # 'M'
-     78: 113,  # 'N'
-     79: 85,  # 'O'
-     80: 79,  # 'P'
-     81: 118,  # 'Q'
-     82: 105,  # 'R'
-     83: 83,  # 'S'
-     84: 67,  # 'T'
-     85: 114,  # 'U'
-     86: 119,  # 'V'
-     87: 95,  # 'W'
-     88: 99,  # 'X'
-     89: 109,  # 'Y'
-     90: 188,  # 'Z'
-     91: 253,  # '['
-     92: 253,  # '\\'
-     93: 253,  # ']'
-     94: 253,  # '^'
-     95: 253,  # '_'
-     96: 253,  # '`'
-     97: 72,  # 'a'
-     98: 70,  # 'b'
-     99: 80,  # 'c'
-     100: 81,  # 'd'
-     101: 60,  # 'e'
-     102: 96,  # 'f'
-     103: 93,  # 'g'
-     104: 89,  # 'h'
-     105: 68,  # 'i'
-     106: 120,  # 'j'
-     107: 97,  # 'k'
-     108: 77,  # 'l'
-     109: 86,  # 'm'
-     110: 69,  # 'n'
-     111: 55,  # 'o'
-     112: 78,  # 'p'
-     113: 115,  # 'q'
-     114: 65,  # 'r'
-     115: 66,  # 's'
-     116: 58,  # 't'
-     117: 76,  # 'u'
-     118: 106,  # 'v'
-     119: 103,  # 'w'
-     120: 87,  # 'x'
-     121: 107,  # 'y'
-     122: 112,  # 'z'
-     123: 253,  # '{'
-     124: 253,  # '|'
-     125: 253,  # '}'
-     126: 253,  # '~'
-     127: 253,  # '\x7f'
-     128: 255,  # '€'
-     129: 255,  # None
-     130: 255,  # '‚'
-     131: 255,  # 'Æ’'
-     132: 255,  # '„'
-     133: 255,  # '…'
-     134: 255,  # '†'
-     135: 255,  # '‡'
-     136: 255,  # None
-     137: 255,  # '‰'
-     138: 255,  # None
-     139: 255,  # '‹'
-     140: 255,  # None
-     141: 255,  # None
-     142: 255,  # None
-     143: 255,  # None
-     144: 255,  # None
-     145: 255,  # '‘'
-     146: 255,  # '’'
-     147: 255,  # '“'
-     148: 255,  # 'â€'
-     149: 255,  # '•'
-     150: 255,  # '–'
-     151: 255,  # '—'
-     152: 255,  # None
-     153: 255,  # 'â„¢'
-     154: 255,  # None
-     155: 255,  # '›'
-     156: 255,  # None
-     157: 255,  # None
-     158: 255,  # None
-     159: 255,  # None
-     160: 253,  # '\xa0'
-     161: 233,  # 'Î…'
-     162: 61,  # 'Ά'
-     163: 253,  # '£'
-     164: 253,  # '¤'
-     165: 253,  # 'Â¥'
-     166: 253,  # '¦'
-     167: 253,  # '§'
-     168: 253,  # '¨'
-     169: 253,  # '©'
-     170: 253,  # None
-     171: 253,  # '«'
-     172: 253,  # '¬'
-     173: 74,  # '\xad'
-     174: 253,  # '®'
-     175: 253,  # '―'
-     176: 253,  # '°'
-     177: 253,  # '±'
-     178: 253,  # '²'
-     179: 253,  # '³'
-     180: 247,  # '΄'
-     181: 253,  # 'µ'
-     182: 253,  # '¶'
-     183: 36,  # '·'
-     184: 46,  # 'Έ'
-     185: 71,  # 'Ή'
-     186: 73,  # 'Ί'
-     187: 253,  # '»'
-     188: 54,  # 'Ό'
-     189: 253,  # '½'
-     190: 108,  # 'ÎŽ'
-     191: 123,  # 'Î'
-     192: 110,  # 'Î'
-     193: 31,  # 'Α'
-     194: 51,  # 'Î’'
-     195: 43,  # 'Γ'
-     196: 41,  # 'Δ'
-     197: 34,  # 'Ε'
-     198: 91,  # 'Ζ'
-     199: 40,  # 'Η'
-     200: 52,  # 'Θ'
-     201: 47,  # 'Ι'
-     202: 44,  # 'Κ'
-     203: 53,  # 'Λ'
-     204: 38,  # 'Μ'
-     205: 49,  # 'Î'
-     206: 59,  # 'Ξ'
-     207: 39,  # 'Ο'
-     208: 35,  # 'Π'
-     209: 48,  # 'Ρ'
-     210: 250,  # None
-     211: 37,  # 'Σ'
-     212: 33,  # 'Τ'
-     213: 45,  # 'Î¥'
-     214: 56,  # 'Φ'
-     215: 50,  # 'Χ'
-     216: 84,  # 'Ψ'
-     217: 57,  # 'Ω'
-     218: 120,  # 'Ϊ'
-     219: 121,  # 'Ϋ'
-     220: 17,  # 'ά'
-     221: 18,  # 'έ'
-     222: 22,  # 'ή'
-     223: 15,  # 'ί'
-     224: 124,  # 'ΰ'
-     225: 1,  # 'α'
-     226: 29,  # 'β'
-     227: 20,  # 'γ'
-     228: 21,  # 'δ'
-     229: 3,  # 'ε'
-     230: 32,  # 'ζ'
-     231: 13,  # 'η'
-     232: 25,  # 'θ'
-     233: 5,  # 'ι'
-     234: 11,  # 'κ'
-     235: 16,  # 'λ'
-     236: 10,  # 'μ'
-     237: 6,  # 'ν'
-     238: 30,  # 'ξ'
-     239: 4,  # 'ο'
-     240: 9,  # 'Ï€'
-     241: 8,  # 'Ï'
-     242: 14,  # 'Ï‚'
-     243: 7,  # 'σ'
-     244: 2,  # 'Ï„'
-     245: 12,  # 'Ï…'
-     246: 28,  # 'φ'
-     247: 23,  # 'χ'
-     248: 42,  # 'ψ'
-     249: 24,  # 'ω'
-     250: 64,  # 'ÏŠ'
-     251: 75,  # 'Ï‹'
-     252: 19,  # 'ό'
-     253: 26,  # 'Ï'
-     254: 27,  # 'ÏŽ'
-     255: 253,  # None
-}
-
-WINDOWS_1253_GREEK_MODEL = SingleByteCharSetModel(charset_name='windows-1253',
-                                                  language='Greek',
-                                                  char_to_order_map=WINDOWS_1253_GREEK_CHAR_TO_ORDER,
-                                                  language_model=GREEK_LANG_MODEL,
-                                                  typical_positive_ratio=0.982851,
-                                                  keep_ascii_letters=False,
-                                                  alphabet='ΆΈΉΊΌΎÎΑΒΓΔΕΖΗΘΙΚΛΜÎΞΟΠΡΣΤΥΦΧΨΩάέήίαβγδεζηθικλμνξοπÏςστυφχψωόÏÏŽ')
-
-ISO_8859_7_GREEK_CHAR_TO_ORDER = {
-     0: 255,  # '\x00'
-     1: 255,  # '\x01'
-     2: 255,  # '\x02'
-     3: 255,  # '\x03'
-     4: 255,  # '\x04'
-     5: 255,  # '\x05'
-     6: 255,  # '\x06'
-     7: 255,  # '\x07'
-     8: 255,  # '\x08'
-     9: 255,  # '\t'
-     10: 254,  # '\n'
-     11: 255,  # '\x0b'
-     12: 255,  # '\x0c'
-     13: 254,  # '\r'
-     14: 255,  # '\x0e'
-     15: 255,  # '\x0f'
-     16: 255,  # '\x10'
-     17: 255,  # '\x11'
-     18: 255,  # '\x12'
-     19: 255,  # '\x13'
-     20: 255,  # '\x14'
-     21: 255,  # '\x15'
-     22: 255,  # '\x16'
-     23: 255,  # '\x17'
-     24: 255,  # '\x18'
-     25: 255,  # '\x19'
-     26: 255,  # '\x1a'
-     27: 255,  # '\x1b'
-     28: 255,  # '\x1c'
-     29: 255,  # '\x1d'
-     30: 255,  # '\x1e'
-     31: 255,  # '\x1f'
-     32: 253,  # ' '
-     33: 253,  # '!'
-     34: 253,  # '"'
-     35: 253,  # '#'
-     36: 253,  # '$'
-     37: 253,  # '%'
-     38: 253,  # '&'
-     39: 253,  # "'"
-     40: 253,  # '('
-     41: 253,  # ')'
-     42: 253,  # '*'
-     43: 253,  # '+'
-     44: 253,  # ','
-     45: 253,  # '-'
-     46: 253,  # '.'
-     47: 253,  # '/'
-     48: 252,  # '0'
-     49: 252,  # '1'
-     50: 252,  # '2'
-     51: 252,  # '3'
-     52: 252,  # '4'
-     53: 252,  # '5'
-     54: 252,  # '6'
-     55: 252,  # '7'
-     56: 252,  # '8'
-     57: 252,  # '9'
-     58: 253,  # ':'
-     59: 253,  # ';'
-     60: 253,  # '<'
-     61: 253,  # '='
-     62: 253,  # '>'
-     63: 253,  # '?'
-     64: 253,  # '@'
-     65: 82,  # 'A'
-     66: 100,  # 'B'
-     67: 104,  # 'C'
-     68: 94,  # 'D'
-     69: 98,  # 'E'
-     70: 101,  # 'F'
-     71: 116,  # 'G'
-     72: 102,  # 'H'
-     73: 111,  # 'I'
-     74: 187,  # 'J'
-     75: 117,  # 'K'
-     76: 92,  # 'L'
-     77: 88,  # 'M'
-     78: 113,  # 'N'
-     79: 85,  # 'O'
-     80: 79,  # 'P'
-     81: 118,  # 'Q'
-     82: 105,  # 'R'
-     83: 83,  # 'S'
-     84: 67,  # 'T'
-     85: 114,  # 'U'
-     86: 119,  # 'V'
-     87: 95,  # 'W'
-     88: 99,  # 'X'
-     89: 109,  # 'Y'
-     90: 188,  # 'Z'
-     91: 253,  # '['
-     92: 253,  # '\\'
-     93: 253,  # ']'
-     94: 253,  # '^'
-     95: 253,  # '_'
-     96: 253,  # '`'
-     97: 72,  # 'a'
-     98: 70,  # 'b'
-     99: 80,  # 'c'
-     100: 81,  # 'd'
-     101: 60,  # 'e'
-     102: 96,  # 'f'
-     103: 93,  # 'g'
-     104: 89,  # 'h'
-     105: 68,  # 'i'
-     106: 120,  # 'j'
-     107: 97,  # 'k'
-     108: 77,  # 'l'
-     109: 86,  # 'm'
-     110: 69,  # 'n'
-     111: 55,  # 'o'
-     112: 78,  # 'p'
-     113: 115,  # 'q'
-     114: 65,  # 'r'
-     115: 66,  # 's'
-     116: 58,  # 't'
-     117: 76,  # 'u'
-     118: 106,  # 'v'
-     119: 103,  # 'w'
-     120: 87,  # 'x'
-     121: 107,  # 'y'
-     122: 112,  # 'z'
-     123: 253,  # '{'
-     124: 253,  # '|'
-     125: 253,  # '}'
-     126: 253,  # '~'
-     127: 253,  # '\x7f'
-     128: 255,  # '\x80'
-     129: 255,  # '\x81'
-     130: 255,  # '\x82'
-     131: 255,  # '\x83'
-     132: 255,  # '\x84'
-     133: 255,  # '\x85'
-     134: 255,  # '\x86'
-     135: 255,  # '\x87'
-     136: 255,  # '\x88'
-     137: 255,  # '\x89'
-     138: 255,  # '\x8a'
-     139: 255,  # '\x8b'
-     140: 255,  # '\x8c'
-     141: 255,  # '\x8d'
-     142: 255,  # '\x8e'
-     143: 255,  # '\x8f'
-     144: 255,  # '\x90'
-     145: 255,  # '\x91'
-     146: 255,  # '\x92'
-     147: 255,  # '\x93'
-     148: 255,  # '\x94'
-     149: 255,  # '\x95'
-     150: 255,  # '\x96'
-     151: 255,  # '\x97'
-     152: 255,  # '\x98'
-     153: 255,  # '\x99'
-     154: 255,  # '\x9a'
-     155: 255,  # '\x9b'
-     156: 255,  # '\x9c'
-     157: 255,  # '\x9d'
-     158: 255,  # '\x9e'
-     159: 255,  # '\x9f'
-     160: 253,  # '\xa0'
-     161: 233,  # '‘'
-     162: 90,  # '’'
-     163: 253,  # '£'
-     164: 253,  # '€'
-     165: 253,  # '₯'
-     166: 253,  # '¦'
-     167: 253,  # '§'
-     168: 253,  # '¨'
-     169: 253,  # '©'
-     170: 253,  # 'ͺ'
-     171: 253,  # '«'
-     172: 253,  # '¬'
-     173: 74,  # '\xad'
-     174: 253,  # None
-     175: 253,  # '―'
-     176: 253,  # '°'
-     177: 253,  # '±'
-     178: 253,  # '²'
-     179: 253,  # '³'
-     180: 247,  # '΄'
-     181: 248,  # 'Î…'
-     182: 61,  # 'Ά'
-     183: 36,  # '·'
-     184: 46,  # 'Έ'
-     185: 71,  # 'Ή'
-     186: 73,  # 'Ί'
-     187: 253,  # '»'
-     188: 54,  # 'Ό'
-     189: 253,  # '½'
-     190: 108,  # 'ÎŽ'
-     191: 123,  # 'Î'
-     192: 110,  # 'Î'
-     193: 31,  # 'Α'
-     194: 51,  # 'Î’'
-     195: 43,  # 'Γ'
-     196: 41,  # 'Δ'
-     197: 34,  # 'Ε'
-     198: 91,  # 'Ζ'
-     199: 40,  # 'Η'
-     200: 52,  # 'Θ'
-     201: 47,  # 'Ι'
-     202: 44,  # 'Κ'
-     203: 53,  # 'Λ'
-     204: 38,  # 'Μ'
-     205: 49,  # 'Î'
-     206: 59,  # 'Ξ'
-     207: 39,  # 'Ο'
-     208: 35,  # 'Π'
-     209: 48,  # 'Ρ'
-     210: 250,  # None
-     211: 37,  # 'Σ'
-     212: 33,  # 'Τ'
-     213: 45,  # 'Î¥'
-     214: 56,  # 'Φ'
-     215: 50,  # 'Χ'
-     216: 84,  # 'Ψ'
-     217: 57,  # 'Ω'
-     218: 120,  # 'Ϊ'
-     219: 121,  # 'Ϋ'
-     220: 17,  # 'ά'
-     221: 18,  # 'έ'
-     222: 22,  # 'ή'
-     223: 15,  # 'ί'
-     224: 124,  # 'ΰ'
-     225: 1,  # 'α'
-     226: 29,  # 'β'
-     227: 20,  # 'γ'
-     228: 21,  # 'δ'
-     229: 3,  # 'ε'
-     230: 32,  # 'ζ'
-     231: 13,  # 'η'
-     232: 25,  # 'θ'
-     233: 5,  # 'ι'
-     234: 11,  # 'κ'
-     235: 16,  # 'λ'
-     236: 10,  # 'μ'
-     237: 6,  # 'ν'
-     238: 30,  # 'ξ'
-     239: 4,  # 'ο'
-     240: 9,  # 'Ï€'
-     241: 8,  # 'Ï'
-     242: 14,  # 'Ï‚'
-     243: 7,  # 'σ'
-     244: 2,  # 'Ï„'
-     245: 12,  # 'Ï…'
-     246: 28,  # 'φ'
-     247: 23,  # 'χ'
-     248: 42,  # 'ψ'
-     249: 24,  # 'ω'
-     250: 64,  # 'ÏŠ'
-     251: 75,  # 'Ï‹'
-     252: 19,  # 'ό'
-     253: 26,  # 'Ï'
-     254: 27,  # 'ÏŽ'
-     255: 253,  # None
-}
-
-ISO_8859_7_GREEK_MODEL = SingleByteCharSetModel(charset_name='ISO-8859-7',
-                                                language='Greek',
-                                                char_to_order_map=ISO_8859_7_GREEK_CHAR_TO_ORDER,
-                                                language_model=GREEK_LANG_MODEL,
-                                                typical_positive_ratio=0.982851,
-                                                keep_ascii_letters=False,
-                                                alphabet='ΆΈΉΊΌΎÎΑΒΓΔΕΖΗΘΙΚΛΜÎΞΟΠΡΣΤΥΦΧΨΩάέήίαβγδεζηθικλμνξοπÏςστυφχψωόÏÏŽ')
-
diff --git a/lib/sub_repos/chardet/chardet/langhebrewmodel.py b/lib/sub_repos/chardet/chardet/langhebrewmodel.py
deleted file mode 100644
index 40fd674c4..000000000
--- a/lib/sub_repos/chardet/chardet/langhebrewmodel.py
+++ /dev/null
@@ -1,4383 +0,0 @@
-#!/usr/bin/env python
-# -*- coding: utf-8 -*-
-
-from chardet.sbcharsetprober import SingleByteCharSetModel
-
-
-# 3: Positive
-# 2: Likely
-# 1: Unlikely
-# 0: Negative
-
-HEBREW_LANG_MODEL = {
-    50: {  # 'a'
-        50: 0,  # 'a'
-        60: 1,  # 'c'
-        61: 1,  # 'd'
-        42: 1,  # 'e'
-        53: 1,  # 'i'
-        56: 2,  # 'l'
-        54: 2,  # 'n'
-        49: 0,  # 'o'
-        51: 2,  # 'r'
-        43: 1,  # 's'
-        44: 2,  # 't'
-        63: 1,  # 'u'
-        34: 0,  # '\xa0'
-        55: 0,  # '´'
-        48: 0,  # '¼'
-        39: 0,  # '½'
-        57: 0,  # '¾'
-        30: 0,  # 'Ö°'
-        59: 0,  # 'Ö±'
-        41: 0,  # 'Ö²'
-        33: 0,  # 'Ö´'
-        37: 0,  # 'Öµ'
-        36: 0,  # 'Ö¶'
-        31: 0,  # 'Ö·'
-        29: 0,  # 'Ö¸'
-        35: 0,  # 'Ö¹'
-        62: 0,  # 'Ö»'
-        28: 0,  # 'Ö¼'
-        38: 0,  # '×'
-        45: 0,  # 'ׂ'
-        9: 0,  # '×'
-        8: 0,  # 'ב'
-        20: 0,  # '×’'
-        16: 0,  # 'ד'
-        3: 1,  # '×”'
-        2: 0,  # 'ו'
-        24: 0,  # '×–'
-        14: 0,  # '×—'
-        22: 0,  # 'ט'
-        1: 0,  # '×™'
-        25: 0,  # 'ך'
-        15: 0,  # '×›'
-        4: 0,  # 'ל'
-        11: 0,  # '×'
-        6: 1,  # 'מ'
-        23: 0,  # 'ן'
-        12: 0,  # '× '
-        19: 0,  # 'ס'
-        13: 0,  # '×¢'
-        26: 0,  # '×£'
-        18: 0,  # 'פ'
-        27: 0,  # '×¥'
-        21: 0,  # 'צ'
-        17: 1,  # '×§'
-        7: 0,  # 'ר'
-        10: 1,  # 'ש'
-        5: 0,  # 'ת'
-        32: 0,  # '–'
-        52: 1,  # '’'
-        47: 0,  # '“'
-        46: 1,  # 'â€'
-        58: 0,  # '†'
-        40: 1,  # '…'
-    },
-    60: {  # 'c'
-        50: 1,  # 'a'
-        60: 1,  # 'c'
-        61: 0,  # 'd'
-        42: 1,  # 'e'
-        53: 1,  # 'i'
-        56: 1,  # 'l'
-        54: 0,  # 'n'
-        49: 1,  # 'o'
-        51: 1,  # 'r'
-        43: 1,  # 's'
-        44: 2,  # 't'
-        63: 1,  # 'u'
-        34: 0,  # '\xa0'
-        55: 0,  # '´'
-        48: 0,  # '¼'
-        39: 0,  # '½'
-        57: 0,  # '¾'
-        30: 0,  # 'Ö°'
-        59: 0,  # 'Ö±'
-        41: 0,  # 'Ö²'
-        33: 0,  # 'Ö´'
-        37: 0,  # 'Öµ'
-        36: 0,  # 'Ö¶'
-        31: 0,  # 'Ö·'
-        29: 0,  # 'Ö¸'
-        35: 0,  # 'Ö¹'
-        62: 0,  # 'Ö»'
-        28: 0,  # 'Ö¼'
-        38: 0,  # '×'
-        45: 0,  # 'ׂ'
-        9: 1,  # '×'
-        8: 0,  # 'ב'
-        20: 0,  # '×’'
-        16: 0,  # 'ד'
-        3: 1,  # '×”'
-        2: 0,  # 'ו'
-        24: 0,  # '×–'
-        14: 0,  # '×—'
-        22: 0,  # 'ט'
-        1: 0,  # '×™'
-        25: 0,  # 'ך'
-        15: 0,  # '×›'
-        4: 0,  # 'ל'
-        11: 0,  # '×'
-        6: 1,  # 'מ'
-        23: 0,  # 'ן'
-        12: 1,  # '× '
-        19: 0,  # 'ס'
-        13: 0,  # '×¢'
-        26: 0,  # '×£'
-        18: 0,  # 'פ'
-        27: 0,  # '×¥'
-        21: 0,  # 'צ'
-        17: 0,  # '×§'
-        7: 0,  # 'ר'
-        10: 0,  # 'ש'
-        5: 0,  # 'ת'
-        32: 0,  # '–'
-        52: 0,  # '’'
-        47: 0,  # '“'
-        46: 1,  # 'â€'
-        58: 0,  # '†'
-        40: 1,  # '…'
-    },
-    61: {  # 'd'
-        50: 1,  # 'a'
-        60: 0,  # 'c'
-        61: 1,  # 'd'
-        42: 1,  # 'e'
-        53: 1,  # 'i'
-        56: 1,  # 'l'
-        54: 1,  # 'n'
-        49: 2,  # 'o'
-        51: 1,  # 'r'
-        43: 1,  # 's'
-        44: 0,  # 't'
-        63: 1,  # 'u'
-        34: 0,  # '\xa0'
-        55: 0,  # '´'
-        48: 0,  # '¼'
-        39: 0,  # '½'
-        57: 0,  # '¾'
-        30: 0,  # 'Ö°'
-        59: 0,  # 'Ö±'
-        41: 0,  # 'Ö²'
-        33: 0,  # 'Ö´'
-        37: 0,  # 'Öµ'
-        36: 0,  # 'Ö¶'
-        31: 0,  # 'Ö·'
-        29: 0,  # 'Ö¸'
-        35: 0,  # 'Ö¹'
-        62: 0,  # 'Ö»'
-        28: 0,  # 'Ö¼'
-        38: 0,  # '×'
-        45: 0,  # 'ׂ'
-        9: 0,  # '×'
-        8: 0,  # 'ב'
-        20: 0,  # '×’'
-        16: 0,  # 'ד'
-        3: 1,  # '×”'
-        2: 0,  # 'ו'
-        24: 0,  # '×–'
-        14: 0,  # '×—'
-        22: 0,  # 'ט'
-        1: 0,  # '×™'
-        25: 0,  # 'ך'
-        15: 0,  # '×›'
-        4: 0,  # 'ל'
-        11: 0,  # '×'
-        6: 0,  # 'מ'
-        23: 0,  # 'ן'
-        12: 0,  # '× '
-        19: 0,  # 'ס'
-        13: 0,  # '×¢'
-        26: 0,  # '×£'
-        18: 0,  # 'פ'
-        27: 0,  # '×¥'
-        21: 0,  # 'צ'
-        17: 0,  # '×§'
-        7: 0,  # 'ר'
-        10: 0,  # 'ש'
-        5: 0,  # 'ת'
-        32: 1,  # '–'
-        52: 1,  # '’'
-        47: 0,  # '“'
-        46: 1,  # 'â€'
-        58: 0,  # '†'
-        40: 1,  # '…'
-    },
-    42: {  # 'e'
-        50: 1,  # 'a'
-        60: 1,  # 'c'
-        61: 2,  # 'd'
-        42: 1,  # 'e'
-        53: 1,  # 'i'
-        56: 2,  # 'l'
-        54: 2,  # 'n'
-        49: 1,  # 'o'
-        51: 2,  # 'r'
-        43: 2,  # 's'
-        44: 2,  # 't'
-        63: 1,  # 'u'
-        34: 1,  # '\xa0'
-        55: 0,  # '´'
-        48: 0,  # '¼'
-        39: 0,  # '½'
-        57: 0,  # '¾'
-        30: 0,  # 'Ö°'
-        59: 0,  # 'Ö±'
-        41: 0,  # 'Ö²'
-        33: 0,  # 'Ö´'
-        37: 0,  # 'Öµ'
-        36: 0,  # 'Ö¶'
-        31: 0,  # 'Ö·'
-        29: 0,  # 'Ö¸'
-        35: 0,  # 'Ö¹'
-        62: 0,  # 'Ö»'
-        28: 0,  # 'Ö¼'
-        38: 0,  # '×'
-        45: 0,  # 'ׂ'
-        9: 0,  # '×'
-        8: 0,  # 'ב'
-        20: 0,  # '×’'
-        16: 0,  # 'ד'
-        3: 0,  # '×”'
-        2: 0,  # 'ו'
-        24: 0,  # '×–'
-        14: 0,  # '×—'
-        22: 0,  # 'ט'
-        1: 0,  # '×™'
-        25: 0,  # 'ך'
-        15: 0,  # '×›'
-        4: 0,  # 'ל'
-        11: 0,  # '×'
-        6: 0,  # 'מ'
-        23: 0,  # 'ן'
-        12: 0,  # '× '
-        19: 0,  # 'ס'
-        13: 0,  # '×¢'
-        26: 0,  # '×£'
-        18: 1,  # 'פ'
-        27: 0,  # '×¥'
-        21: 0,  # 'צ'
-        17: 0,  # '×§'
-        7: 0,  # 'ר'
-        10: 0,  # 'ש'
-        5: 0,  # 'ת'
-        32: 1,  # '–'
-        52: 2,  # '’'
-        47: 0,  # '“'
-        46: 1,  # 'â€'
-        58: 0,  # '†'
-        40: 1,  # '…'
-    },
-    53: {  # 'i'
-        50: 1,  # 'a'
-        60: 2,  # 'c'
-        61: 1,  # 'd'
-        42: 1,  # 'e'
-        53: 0,  # 'i'
-        56: 1,  # 'l'
-        54: 2,  # 'n'
-        49: 2,  # 'o'
-        51: 1,  # 'r'
-        43: 2,  # 's'
-        44: 2,  # 't'
-        63: 1,  # 'u'
-        34: 0,  # '\xa0'
-        55: 1,  # '´'
-        48: 0,  # '¼'
-        39: 0,  # '½'
-        57: 0,  # '¾'
-        30: 0,  # 'Ö°'
-        59: 0,  # 'Ö±'
-        41: 0,  # 'Ö²'
-        33: 0,  # 'Ö´'
-        37: 0,  # 'Öµ'
-        36: 0,  # 'Ö¶'
-        31: 0,  # 'Ö·'
-        29: 0,  # 'Ö¸'
-        35: 0,  # 'Ö¹'
-        62: 0,  # 'Ö»'
-        28: 0,  # 'Ö¼'
-        38: 0,  # '×'
-        45: 0,  # 'ׂ'
-        9: 0,  # '×'
-        8: 0,  # 'ב'
-        20: 0,  # '×’'
-        16: 0,  # 'ד'
-        3: 0,  # '×”'
-        2: 0,  # 'ו'
-        24: 0,  # '×–'
-        14: 0,  # '×—'
-        22: 0,  # 'ט'
-        1: 0,  # '×™'
-        25: 0,  # 'ך'
-        15: 0,  # '×›'
-        4: 0,  # 'ל'
-        11: 0,  # '×'
-        6: 0,  # 'מ'
-        23: 0,  # 'ן'
-        12: 0,  # '× '
-        19: 0,  # 'ס'
-        13: 0,  # '×¢'
-        26: 0,  # '×£'
-        18: 0,  # 'פ'
-        27: 0,  # '×¥'
-        21: 0,  # 'צ'
-        17: 0,  # '×§'
-        7: 0,  # 'ר'
-        10: 0,  # 'ש'
-        5: 0,  # 'ת'
-        32: 0,  # '–'
-        52: 1,  # '’'
-        47: 0,  # '“'
-        46: 0,  # 'â€'
-        58: 0,  # '†'
-        40: 0,  # '…'
-    },
-    56: {  # 'l'
-        50: 1,  # 'a'
-        60: 1,  # 'c'
-        61: 1,  # 'd'
-        42: 2,  # 'e'
-        53: 2,  # 'i'
-        56: 2,  # 'l'
-        54: 1,  # 'n'
-        49: 1,  # 'o'
-        51: 0,  # 'r'
-        43: 1,  # 's'
-        44: 1,  # 't'
-        63: 1,  # 'u'
-        34: 0,  # '\xa0'
-        55: 0,  # '´'
-        48: 0,  # '¼'
-        39: 0,  # '½'
-        57: 0,  # '¾'
-        30: 0,  # 'Ö°'
-        59: 0,  # 'Ö±'
-        41: 0,  # 'Ö²'
-        33: 0,  # 'Ö´'
-        37: 0,  # 'Öµ'
-        36: 0,  # 'Ö¶'
-        31: 0,  # 'Ö·'
-        29: 0,  # 'Ö¸'
-        35: 0,  # 'Ö¹'
-        62: 0,  # 'Ö»'
-        28: 0,  # 'Ö¼'
-        38: 0,  # '×'
-        45: 0,  # 'ׂ'
-        9: 0,  # '×'
-        8: 0,  # 'ב'
-        20: 0,  # '×’'
-        16: 0,  # 'ד'
-        3: 0,  # '×”'
-        2: 0,  # 'ו'
-        24: 0,  # '×–'
-        14: 0,  # '×—'
-        22: 0,  # 'ט'
-        1: 0,  # '×™'
-        25: 0,  # 'ך'
-        15: 0,  # '×›'
-        4: 0,  # 'ל'
-        11: 0,  # '×'
-        6: 0,  # 'מ'
-        23: 0,  # 'ן'
-        12: 0,  # '× '
-        19: 0,  # 'ס'
-        13: 0,  # '×¢'
-        26: 0,  # '×£'
-        18: 0,  # 'פ'
-        27: 0,  # '×¥'
-        21: 0,  # 'צ'
-        17: 0,  # '×§'
-        7: 0,  # 'ר'
-        10: 0,  # 'ש'
-        5: 0,  # 'ת'
-        32: 0,  # '–'
-        52: 1,  # '’'
-        47: 0,  # '“'
-        46: 1,  # 'â€'
-        58: 0,  # '†'
-        40: 1,  # '…'
-    },
-    54: {  # 'n'
-        50: 1,  # 'a'
-        60: 1,  # 'c'
-        61: 1,  # 'd'
-        42: 1,  # 'e'
-        53: 1,  # 'i'
-        56: 1,  # 'l'
-        54: 1,  # 'n'
-        49: 1,  # 'o'
-        51: 0,  # 'r'
-        43: 1,  # 's'
-        44: 2,  # 't'
-        63: 1,  # 'u'
-        34: 0,  # '\xa0'
-        55: 0,  # '´'
-        48: 0,  # '¼'
-        39: 0,  # '½'
-        57: 0,  # '¾'
-        30: 0,  # 'Ö°'
-        59: 0,  # 'Ö±'
-        41: 0,  # 'Ö²'
-        33: 0,  # 'Ö´'
-        37: 0,  # 'Öµ'
-        36: 0,  # 'Ö¶'
-        31: 0,  # 'Ö·'
-        29: 0,  # 'Ö¸'
-        35: 0,  # 'Ö¹'
-        62: 0,  # 'Ö»'
-        28: 0,  # 'Ö¼'
-        38: 0,  # '×'
-        45: 0,  # 'ׂ'
-        9: 0,  # '×'
-        8: 0,  # 'ב'
-        20: 0,  # '×’'
-        16: 0,  # 'ד'
-        3: 1,  # '×”'
-        2: 0,  # 'ו'
-        24: 0,  # '×–'
-        14: 0,  # '×—'
-        22: 0,  # 'ט'
-        1: 0,  # '×™'
-        25: 0,  # 'ך'
-        15: 0,  # '×›'
-        4: 0,  # 'ל'
-        11: 0,  # '×'
-        6: 0,  # 'מ'
-        23: 0,  # 'ן'
-        12: 0,  # '× '
-        19: 0,  # 'ס'
-        13: 0,  # '×¢'
-        26: 0,  # '×£'
-        18: 0,  # 'פ'
-        27: 0,  # '×¥'
-        21: 0,  # 'צ'
-        17: 0,  # '×§'
-        7: 0,  # 'ר'
-        10: 0,  # 'ש'
-        5: 0,  # 'ת'
-        32: 0,  # '–'
-        52: 2,  # '’'
-        47: 0,  # '“'
-        46: 1,  # 'â€'
-        58: 0,  # '†'
-        40: 1,  # '…'
-    },
-    49: {  # 'o'
-        50: 1,  # 'a'
-        60: 1,  # 'c'
-        61: 1,  # 'd'
-        42: 1,  # 'e'
-        53: 1,  # 'i'
-        56: 1,  # 'l'
-        54: 2,  # 'n'
-        49: 1,  # 'o'
-        51: 2,  # 'r'
-        43: 1,  # 's'
-        44: 1,  # 't'
-        63: 1,  # 'u'
-        34: 0,  # '\xa0'
-        55: 0,  # '´'
-        48: 0,  # '¼'
-        39: 0,  # '½'
-        57: 0,  # '¾'
-        30: 0,  # 'Ö°'
-        59: 0,  # 'Ö±'
-        41: 0,  # 'Ö²'
-        33: 0,  # 'Ö´'
-        37: 0,  # 'Öµ'
-        36: 0,  # 'Ö¶'
-        31: 0,  # 'Ö·'
-        29: 0,  # 'Ö¸'
-        35: 0,  # 'Ö¹'
-        62: 0,  # 'Ö»'
-        28: 0,  # 'Ö¼'
-        38: 0,  # '×'
-        45: 0,  # 'ׂ'
-        9: 0,  # '×'
-        8: 0,  # 'ב'
-        20: 0,  # '×’'
-        16: 0,  # 'ד'
-        3: 0,  # '×”'
-        2: 0,  # 'ו'
-        24: 0,  # '×–'
-        14: 0,  # '×—'
-        22: 0,  # 'ט'
-        1: 0,  # '×™'
-        25: 0,  # 'ך'
-        15: 0,  # '×›'
-        4: 0,  # 'ל'
-        11: 0,  # '×'
-        6: 0,  # 'מ'
-        23: 0,  # 'ן'
-        12: 0,  # '× '
-        19: 0,  # 'ס'
-        13: 0,  # '×¢'
-        26: 0,  # '×£'
-        18: 0,  # 'פ'
-        27: 0,  # '×¥'
-        21: 0,  # 'צ'
-        17: 0,  # '×§'
-        7: 0,  # 'ר'
-        10: 0,  # 'ש'
-        5: 0,  # 'ת'
-        32: 0,  # '–'
-        52: 1,  # '’'
-        47: 0,  # '“'
-        46: 1,  # 'â€'
-        58: 0,  # '†'
-        40: 1,  # '…'
-    },
-    51: {  # 'r'
-        50: 2,  # 'a'
-        60: 1,  # 'c'
-        61: 1,  # 'd'
-        42: 2,  # 'e'
-        53: 1,  # 'i'
-        56: 1,  # 'l'
-        54: 1,  # 'n'
-        49: 2,  # 'o'
-        51: 1,  # 'r'
-        43: 1,  # 's'
-        44: 1,  # 't'
-        63: 1,  # 'u'
-        34: 0,  # '\xa0'
-        55: 0,  # '´'
-        48: 0,  # '¼'
-        39: 0,  # '½'
-        57: 0,  # '¾'
-        30: 0,  # 'Ö°'
-        59: 0,  # 'Ö±'
-        41: 0,  # 'Ö²'
-        33: 0,  # 'Ö´'
-        37: 0,  # 'Öµ'
-        36: 0,  # 'Ö¶'
-        31: 0,  # 'Ö·'
-        29: 0,  # 'Ö¸'
-        35: 0,  # 'Ö¹'
-        62: 0,  # 'Ö»'
-        28: 0,  # 'Ö¼'
-        38: 0,  # '×'
-        45: 0,  # 'ׂ'
-        9: 0,  # '×'
-        8: 0,  # 'ב'
-        20: 0,  # '×’'
-        16: 0,  # 'ד'
-        3: 0,  # '×”'
-        2: 0,  # 'ו'
-        24: 0,  # '×–'
-        14: 0,  # '×—'
-        22: 0,  # 'ט'
-        1: 0,  # '×™'
-        25: 0,  # 'ך'
-        15: 0,  # '×›'
-        4: 0,  # 'ל'
-        11: 0,  # '×'
-        6: 0,  # 'מ'
-        23: 0,  # 'ן'
-        12: 0,  # '× '
-        19: 0,  # 'ס'
-        13: 0,  # '×¢'
-        26: 0,  # '×£'
-        18: 0,  # 'פ'
-        27: 0,  # '×¥'
-        21: 0,  # 'צ'
-        17: 0,  # '×§'
-        7: 0,  # 'ר'
-        10: 0,  # 'ש'
-        5: 0,  # 'ת'
-        32: 0,  # '–'
-        52: 2,  # '’'
-        47: 0,  # '“'
-        46: 1,  # 'â€'
-        58: 0,  # '†'
-        40: 1,  # '…'
-    },
-    43: {  # 's'
-        50: 1,  # 'a'
-        60: 1,  # 'c'
-        61: 0,  # 'd'
-        42: 2,  # 'e'
-        53: 1,  # 'i'
-        56: 1,  # 'l'
-        54: 1,  # 'n'
-        49: 1,  # 'o'
-        51: 1,  # 'r'
-        43: 1,  # 's'
-        44: 2,  # 't'
-        63: 1,  # 'u'
-        34: 0,  # '\xa0'
-        55: 0,  # '´'
-        48: 0,  # '¼'
-        39: 0,  # '½'
-        57: 0,  # '¾'
-        30: 0,  # 'Ö°'
-        59: 0,  # 'Ö±'
-        41: 0,  # 'Ö²'
-        33: 0,  # 'Ö´'
-        37: 0,  # 'Öµ'
-        36: 0,  # 'Ö¶'
-        31: 0,  # 'Ö·'
-        29: 0,  # 'Ö¸'
-        35: 0,  # 'Ö¹'
-        62: 0,  # 'Ö»'
-        28: 0,  # 'Ö¼'
-        38: 0,  # '×'
-        45: 0,  # 'ׂ'
-        9: 0,  # '×'
-        8: 0,  # 'ב'
-        20: 0,  # '×’'
-        16: 0,  # 'ד'
-        3: 0,  # '×”'
-        2: 0,  # 'ו'
-        24: 0,  # '×–'
-        14: 0,  # '×—'
-        22: 0,  # 'ט'
-        1: 0,  # '×™'
-        25: 0,  # 'ך'
-        15: 0,  # '×›'
-        4: 0,  # 'ל'
-        11: 0,  # '×'
-        6: 0,  # 'מ'
-        23: 0,  # 'ן'
-        12: 0,  # '× '
-        19: 0,  # 'ס'
-        13: 0,  # '×¢'
-        26: 0,  # '×£'
-        18: 0,  # 'פ'
-        27: 0,  # '×¥'
-        21: 0,  # 'צ'
-        17: 0,  # '×§'
-        7: 0,  # 'ר'
-        10: 0,  # 'ש'
-        5: 0,  # 'ת'
-        32: 0,  # '–'
-        52: 1,  # '’'
-        47: 0,  # '“'
-        46: 2,  # 'â€'
-        58: 0,  # '†'
-        40: 2,  # '…'
-    },
-    44: {  # 't'
-        50: 1,  # 'a'
-        60: 1,  # 'c'
-        61: 0,  # 'd'
-        42: 2,  # 'e'
-        53: 2,  # 'i'
-        56: 1,  # 'l'
-        54: 0,  # 'n'
-        49: 1,  # 'o'
-        51: 1,  # 'r'
-        43: 1,  # 's'
-        44: 1,  # 't'
-        63: 1,  # 'u'
-        34: 1,  # '\xa0'
-        55: 0,  # '´'
-        48: 0,  # '¼'
-        39: 0,  # '½'
-        57: 0,  # '¾'
-        30: 0,  # 'Ö°'
-        59: 0,  # 'Ö±'
-        41: 0,  # 'Ö²'
-        33: 0,  # 'Ö´'
-        37: 0,  # 'Öµ'
-        36: 0,  # 'Ö¶'
-        31: 0,  # 'Ö·'
-        29: 0,  # 'Ö¸'
-        35: 0,  # 'Ö¹'
-        62: 0,  # 'Ö»'
-        28: 0,  # 'Ö¼'
-        38: 0,  # '×'
-        45: 0,  # 'ׂ'
-        9: 0,  # '×'
-        8: 0,  # 'ב'
-        20: 0,  # '×’'
-        16: 0,  # 'ד'
-        3: 0,  # '×”'
-        2: 0,  # 'ו'
-        24: 0,  # '×–'
-        14: 0,  # '×—'
-        22: 0,  # 'ט'
-        1: 0,  # '×™'
-        25: 0,  # 'ך'
-        15: 0,  # '×›'
-        4: 0,  # 'ל'
-        11: 0,  # '×'
-        6: 0,  # 'מ'
-        23: 0,  # 'ן'
-        12: 0,  # '× '
-        19: 0,  # 'ס'
-        13: 0,  # '×¢'
-        26: 0,  # '×£'
-        18: 0,  # 'פ'
-        27: 0,  # '×¥'
-        21: 0,  # 'צ'
-        17: 0,  # '×§'
-        7: 0,  # 'ר'
-        10: 0,  # 'ש'
-        5: 0,  # 'ת'
-        32: 0,  # '–'
-        52: 2,  # '’'
-        47: 0,  # '“'
-        46: 1,  # 'â€'
-        58: 0,  # '†'
-        40: 1,  # '…'
-    },
-    63: {  # 'u'
-        50: 1,  # 'a'
-        60: 1,  # 'c'
-        61: 1,  # 'd'
-        42: 1,  # 'e'
-        53: 1,  # 'i'
-        56: 1,  # 'l'
-        54: 1,  # 'n'
-        49: 0,  # 'o'
-        51: 1,  # 'r'
-        43: 2,  # 's'
-        44: 1,  # 't'
-        63: 0,  # 'u'
-        34: 0,  # '\xa0'
-        55: 0,  # '´'
-        48: 0,  # '¼'
-        39: 0,  # '½'
-        57: 0,  # '¾'
-        30: 0,  # 'Ö°'
-        59: 0,  # 'Ö±'
-        41: 0,  # 'Ö²'
-        33: 0,  # 'Ö´'
-        37: 0,  # 'Öµ'
-        36: 0,  # 'Ö¶'
-        31: 0,  # 'Ö·'
-        29: 0,  # 'Ö¸'
-        35: 0,  # 'Ö¹'
-        62: 0,  # 'Ö»'
-        28: 0,  # 'Ö¼'
-        38: 0,  # '×'
-        45: 0,  # 'ׂ'
-        9: 0,  # '×'
-        8: 0,  # 'ב'
-        20: 0,  # '×’'
-        16: 0,  # 'ד'
-        3: 0,  # '×”'
-        2: 0,  # 'ו'
-        24: 0,  # '×–'
-        14: 0,  # '×—'
-        22: 0,  # 'ט'
-        1: 0,  # '×™'
-        25: 0,  # 'ך'
-        15: 0,  # '×›'
-        4: 0,  # 'ל'
-        11: 0,  # '×'
-        6: 0,  # 'מ'
-        23: 0,  # 'ן'
-        12: 0,  # '× '
-        19: 0,  # 'ס'
-        13: 0,  # '×¢'
-        26: 0,  # '×£'
-        18: 0,  # 'פ'
-        27: 0,  # '×¥'
-        21: 0,  # 'צ'
-        17: 0,  # '×§'
-        7: 0,  # 'ר'
-        10: 0,  # 'ש'
-        5: 0,  # 'ת'
-        32: 0,  # '–'
-        52: 1,  # '’'
-        47: 0,  # '“'
-        46: 0,  # 'â€'
-        58: 0,  # '†'
-        40: 0,  # '…'
-    },
-    34: {  # '\xa0'
-        50: 1,  # 'a'
-        60: 0,  # 'c'
-        61: 1,  # 'd'
-        42: 0,  # 'e'
-        53: 1,  # 'i'
-        56: 0,  # 'l'
-        54: 1,  # 'n'
-        49: 1,  # 'o'
-        51: 0,  # 'r'
-        43: 1,  # 's'
-        44: 1,  # 't'
-        63: 0,  # 'u'
-        34: 2,  # '\xa0'
-        55: 0,  # '´'
-        48: 0,  # '¼'
-        39: 0,  # '½'
-        57: 0,  # '¾'
-        30: 0,  # 'Ö°'
-        59: 0,  # 'Ö±'
-        41: 0,  # 'Ö²'
-        33: 0,  # 'Ö´'
-        37: 0,  # 'Öµ'
-        36: 0,  # 'Ö¶'
-        31: 0,  # 'Ö·'
-        29: 0,  # 'Ö¸'
-        35: 0,  # 'Ö¹'
-        62: 0,  # 'Ö»'
-        28: 0,  # 'Ö¼'
-        38: 0,  # '×'
-        45: 0,  # 'ׂ'
-        9: 2,  # '×'
-        8: 1,  # 'ב'
-        20: 1,  # '×’'
-        16: 1,  # 'ד'
-        3: 1,  # '×”'
-        2: 1,  # 'ו'
-        24: 1,  # '×–'
-        14: 1,  # '×—'
-        22: 1,  # 'ט'
-        1: 2,  # '×™'
-        25: 0,  # 'ך'
-        15: 1,  # '×›'
-        4: 1,  # 'ל'
-        11: 0,  # '×'
-        6: 2,  # 'מ'
-        23: 0,  # 'ן'
-        12: 1,  # '× '
-        19: 1,  # 'ס'
-        13: 1,  # '×¢'
-        26: 0,  # '×£'
-        18: 1,  # 'פ'
-        27: 0,  # '×¥'
-        21: 1,  # 'צ'
-        17: 1,  # '×§'
-        7: 1,  # 'ר'
-        10: 1,  # 'ש'
-        5: 1,  # 'ת'
-        32: 0,  # '–'
-        52: 0,  # '’'
-        47: 0,  # '“'
-        46: 0,  # 'â€'
-        58: 0,  # '†'
-        40: 0,  # '…'
-    },
-    55: {  # '´'
-        50: 0,  # 'a'
-        60: 0,  # 'c'
-        61: 0,  # 'd'
-        42: 0,  # 'e'
-        53: 0,  # 'i'
-        56: 0,  # 'l'
-        54: 0,  # 'n'
-        49: 0,  # 'o'
-        51: 0,  # 'r'
-        43: 1,  # 's'
-        44: 0,  # 't'
-        63: 0,  # 'u'
-        34: 0,  # '\xa0'
-        55: 0,  # '´'
-        48: 0,  # '¼'
-        39: 0,  # '½'
-        57: 0,  # '¾'
-        30: 0,  # 'Ö°'
-        59: 0,  # 'Ö±'
-        41: 0,  # 'Ö²'
-        33: 0,  # 'Ö´'
-        37: 0,  # 'Öµ'
-        36: 0,  # 'Ö¶'
-        31: 0,  # 'Ö·'
-        29: 0,  # 'Ö¸'
-        35: 0,  # 'Ö¹'
-        62: 0,  # 'Ö»'
-        28: 0,  # 'Ö¼'
-        38: 0,  # '×'
-        45: 0,  # 'ׂ'
-        9: 1,  # '×'
-        8: 0,  # 'ב'
-        20: 0,  # '×’'
-        16: 0,  # 'ד'
-        3: 1,  # '×”'
-        2: 1,  # 'ו'
-        24: 0,  # '×–'
-        14: 0,  # '×—'
-        22: 0,  # 'ט'
-        1: 2,  # '×™'
-        25: 0,  # 'ך'
-        15: 0,  # '×›'
-        4: 1,  # 'ל'
-        11: 0,  # '×'
-        6: 1,  # 'מ'
-        23: 1,  # 'ן'
-        12: 1,  # '× '
-        19: 1,  # 'ס'
-        13: 0,  # '×¢'
-        26: 0,  # '×£'
-        18: 0,  # 'פ'
-        27: 0,  # '×¥'
-        21: 0,  # 'צ'
-        17: 0,  # '×§'
-        7: 1,  # 'ר'
-        10: 1,  # 'ש'
-        5: 0,  # 'ת'
-        32: 0,  # '–'
-        52: 0,  # '’'
-        47: 0,  # '“'
-        46: 0,  # 'â€'
-        58: 0,  # '†'
-        40: 0,  # '…'
-    },
-    48: {  # '¼'
-        50: 0,  # 'a'
-        60: 0,  # 'c'
-        61: 0,  # 'd'
-        42: 0,  # 'e'
-        53: 0,  # 'i'
-        56: 0,  # 'l'
-        54: 0,  # 'n'
-        49: 0,  # 'o'
-        51: 0,  # 'r'
-        43: 0,  # 's'
-        44: 0,  # 't'
-        63: 0,  # 'u'
-        34: 0,  # '\xa0'
-        55: 0,  # '´'
-        48: 0,  # '¼'
-        39: 0,  # '½'
-        57: 0,  # '¾'
-        30: 0,  # 'Ö°'
-        59: 0,  # 'Ö±'
-        41: 0,  # 'Ö²'
-        33: 0,  # 'Ö´'
-        37: 0,  # 'Öµ'
-        36: 0,  # 'Ö¶'
-        31: 0,  # 'Ö·'
-        29: 0,  # 'Ö¸'
-        35: 0,  # 'Ö¹'
-        62: 0,  # 'Ö»'
-        28: 0,  # 'Ö¼'
-        38: 0,  # '×'
-        45: 0,  # 'ׂ'
-        9: 1,  # '×'
-        8: 0,  # 'ב'
-        20: 0,  # '×’'
-        16: 0,  # 'ד'
-        3: 0,  # '×”'
-        2: 1,  # 'ו'
-        24: 0,  # '×–'
-        14: 0,  # '×—'
-        22: 0,  # 'ט'
-        1: 0,  # '×™'
-        25: 0,  # 'ך'
-        15: 1,  # '×›'
-        4: 1,  # 'ל'
-        11: 0,  # '×'
-        6: 1,  # 'מ'
-        23: 0,  # 'ן'
-        12: 0,  # '× '
-        19: 0,  # 'ס'
-        13: 0,  # '×¢'
-        26: 0,  # '×£'
-        18: 0,  # 'פ'
-        27: 0,  # '×¥'
-        21: 0,  # 'צ'
-        17: 0,  # '×§'
-        7: 0,  # 'ר'
-        10: 0,  # 'ש'
-        5: 0,  # 'ת'
-        32: 0,  # '–'
-        52: 0,  # '’'
-        47: 0,  # '“'
-        46: 0,  # 'â€'
-        58: 0,  # '†'
-        40: 0,  # '…'
-    },
-    39: {  # '½'
-        50: 0,  # 'a'
-        60: 0,  # 'c'
-        61: 0,  # 'd'
-        42: 0,  # 'e'
-        53: 0,  # 'i'
-        56: 0,  # 'l'
-        54: 0,  # 'n'
-        49: 0,  # 'o'
-        51: 0,  # 'r'
-        43: 0,  # 's'
-        44: 0,  # 't'
-        63: 0,  # 'u'
-        34: 0,  # '\xa0'
-        55: 0,  # '´'
-        48: 0,  # '¼'
-        39: 0,  # '½'
-        57: 0,  # '¾'
-        30: 0,  # 'Ö°'
-        59: 0,  # 'Ö±'
-        41: 0,  # 'Ö²'
-        33: 0,  # 'Ö´'
-        37: 0,  # 'Öµ'
-        36: 0,  # 'Ö¶'
-        31: 0,  # 'Ö·'
-        29: 0,  # 'Ö¸'
-        35: 0,  # 'Ö¹'
-        62: 0,  # 'Ö»'
-        28: 0,  # 'Ö¼'
-        38: 0,  # '×'
-        45: 0,  # 'ׂ'
-        9: 0,  # '×'
-        8: 0,  # 'ב'
-        20: 0,  # '×’'
-        16: 0,  # 'ד'
-        3: 0,  # '×”'
-        2: 0,  # 'ו'
-        24: 0,  # '×–'
-        14: 0,  # '×—'
-        22: 0,  # 'ט'
-        1: 0,  # '×™'
-        25: 0,  # 'ך'
-        15: 1,  # '×›'
-        4: 1,  # 'ל'
-        11: 0,  # '×'
-        6: 0,  # 'מ'
-        23: 0,  # 'ן'
-        12: 0,  # '× '
-        19: 0,  # 'ס'
-        13: 0,  # '×¢'
-        26: 0,  # '×£'
-        18: 0,  # 'פ'
-        27: 0,  # '×¥'
-        21: 1,  # 'צ'
-        17: 1,  # '×§'
-        7: 0,  # 'ר'
-        10: 0,  # 'ש'
-        5: 0,  # 'ת'
-        32: 0,  # '–'
-        52: 0,  # '’'
-        47: 0,  # '“'
-        46: 0,  # 'â€'
-        58: 0,  # '†'
-        40: 0,  # '…'
-    },
-    57: {  # '¾'
-        50: 0,  # 'a'
-        60: 0,  # 'c'
-        61: 0,  # 'd'
-        42: 0,  # 'e'
-        53: 0,  # 'i'
-        56: 0,  # 'l'
-        54: 0,  # 'n'
-        49: 0,  # 'o'
-        51: 0,  # 'r'
-        43: 0,  # 's'
-        44: 0,  # 't'
-        63: 0,  # 'u'
-        34: 0,  # '\xa0'
-        55: 0,  # '´'
-        48: 0,  # '¼'
-        39: 0,  # '½'
-        57: 0,  # '¾'
-        30: 0,  # 'Ö°'
-        59: 0,  # 'Ö±'
-        41: 0,  # 'Ö²'
-        33: 0,  # 'Ö´'
-        37: 0,  # 'Öµ'
-        36: 0,  # 'Ö¶'
-        31: 0,  # 'Ö·'
-        29: 0,  # 'Ö¸'
-        35: 0,  # 'Ö¹'
-        62: 0,  # 'Ö»'
-        28: 0,  # 'Ö¼'
-        38: 0,  # '×'
-        45: 0,  # 'ׂ'
-        9: 0,  # '×'
-        8: 0,  # 'ב'
-        20: 0,  # '×’'
-        16: 0,  # 'ד'
-        3: 0,  # '×”'
-        2: 0,  # 'ו'
-        24: 0,  # '×–'
-        14: 0,  # '×—'
-        22: 0,  # 'ט'
-        1: 0,  # '×™'
-        25: 0,  # 'ך'
-        15: 0,  # '×›'
-        4: 0,  # 'ל'
-        11: 0,  # '×'
-        6: 0,  # 'מ'
-        23: 0,  # 'ן'
-        12: 0,  # '× '
-        19: 0,  # 'ס'
-        13: 0,  # '×¢'
-        26: 0,  # '×£'
-        18: 0,  # 'פ'
-        27: 0,  # '×¥'
-        21: 0,  # 'צ'
-        17: 0,  # '×§'
-        7: 0,  # 'ר'
-        10: 0,  # 'ש'
-        5: 0,  # 'ת'
-        32: 0,  # '–'
-        52: 0,  # '’'
-        47: 0,  # '“'
-        46: 0,  # 'â€'
-        58: 0,  # '†'
-        40: 0,  # '…'
-    },
-    30: {  # 'Ö°'
-        50: 0,  # 'a'
-        60: 0,  # 'c'
-        61: 0,  # 'd'
-        42: 0,  # 'e'
-        53: 0,  # 'i'
-        56: 0,  # 'l'
-        54: 0,  # 'n'
-        49: 0,  # 'o'
-        51: 0,  # 'r'
-        43: 0,  # 's'
-        44: 0,  # 't'
-        63: 0,  # 'u'
-        34: 0,  # '\xa0'
-        55: 0,  # '´'
-        48: 0,  # '¼'
-        39: 0,  # '½'
-        57: 0,  # '¾'
-        30: 0,  # 'Ö°'
-        59: 0,  # 'Ö±'
-        41: 0,  # 'Ö²'
-        33: 0,  # 'Ö´'
-        37: 0,  # 'Öµ'
-        36: 1,  # 'Ö¶'
-        31: 0,  # 'Ö·'
-        29: 0,  # 'Ö¸'
-        35: 1,  # 'Ö¹'
-        62: 0,  # 'Ö»'
-        28: 0,  # 'Ö¼'
-        38: 0,  # '×'
-        45: 0,  # 'ׂ'
-        9: 2,  # '×'
-        8: 2,  # 'ב'
-        20: 2,  # '×’'
-        16: 2,  # 'ד'
-        3: 2,  # '×”'
-        2: 2,  # 'ו'
-        24: 2,  # '×–'
-        14: 2,  # '×—'
-        22: 2,  # 'ט'
-        1: 2,  # '×™'
-        25: 2,  # 'ך'
-        15: 2,  # '×›'
-        4: 2,  # 'ל'
-        11: 1,  # '×'
-        6: 2,  # 'מ'
-        23: 0,  # 'ן'
-        12: 2,  # '× '
-        19: 2,  # 'ס'
-        13: 2,  # '×¢'
-        26: 0,  # '×£'
-        18: 2,  # 'פ'
-        27: 0,  # '×¥'
-        21: 2,  # 'צ'
-        17: 2,  # '×§'
-        7: 2,  # 'ר'
-        10: 2,  # 'ש'
-        5: 2,  # 'ת'
-        32: 0,  # '–'
-        52: 0,  # '’'
-        47: 0,  # '“'
-        46: 0,  # 'â€'
-        58: 0,  # '†'
-        40: 0,  # '…'
-    },
-    59: {  # 'Ö±'
-        50: 0,  # 'a'
-        60: 0,  # 'c'
-        61: 0,  # 'd'
-        42: 0,  # 'e'
-        53: 0,  # 'i'
-        56: 0,  # 'l'
-        54: 0,  # 'n'
-        49: 0,  # 'o'
-        51: 0,  # 'r'
-        43: 0,  # 's'
-        44: 0,  # 't'
-        63: 0,  # 'u'
-        34: 0,  # '\xa0'
-        55: 0,  # '´'
-        48: 0,  # '¼'
-        39: 0,  # '½'
-        57: 0,  # '¾'
-        30: 1,  # 'Ö°'
-        59: 0,  # 'Ö±'
-        41: 0,  # 'Ö²'
-        33: 0,  # 'Ö´'
-        37: 0,  # 'Öµ'
-        36: 0,  # 'Ö¶'
-        31: 0,  # 'Ö·'
-        29: 0,  # 'Ö¸'
-        35: 0,  # 'Ö¹'
-        62: 0,  # 'Ö»'
-        28: 0,  # 'Ö¼'
-        38: 0,  # '×'
-        45: 0,  # 'ׂ'
-        9: 0,  # '×'
-        8: 1,  # 'ב'
-        20: 1,  # '×’'
-        16: 0,  # 'ד'
-        3: 0,  # '×”'
-        2: 0,  # 'ו'
-        24: 1,  # '×–'
-        14: 0,  # '×—'
-        22: 0,  # 'ט'
-        1: 1,  # '×™'
-        25: 0,  # 'ך'
-        15: 1,  # '×›'
-        4: 2,  # 'ל'
-        11: 0,  # '×'
-        6: 2,  # 'מ'
-        23: 0,  # 'ן'
-        12: 1,  # '× '
-        19: 0,  # 'ס'
-        13: 0,  # '×¢'
-        26: 0,  # '×£'
-        18: 0,  # 'פ'
-        27: 0,  # '×¥'
-        21: 0,  # 'צ'
-        17: 0,  # '×§'
-        7: 1,  # 'ר'
-        10: 1,  # 'ש'
-        5: 0,  # 'ת'
-        32: 0,  # '–'
-        52: 0,  # '’'
-        47: 0,  # '“'
-        46: 0,  # 'â€'
-        58: 0,  # '†'
-        40: 0,  # '…'
-    },
-    41: {  # 'Ö²'
-        50: 0,  # 'a'
-        60: 0,  # 'c'
-        61: 0,  # 'd'
-        42: 0,  # 'e'
-        53: 0,  # 'i'
-        56: 0,  # 'l'
-        54: 0,  # 'n'
-        49: 0,  # 'o'
-        51: 0,  # 'r'
-        43: 0,  # 's'
-        44: 0,  # 't'
-        63: 0,  # 'u'
-        34: 0,  # '\xa0'
-        55: 0,  # '´'
-        48: 0,  # '¼'
-        39: 0,  # '½'
-        57: 0,  # '¾'
-        30: 0,  # 'Ö°'
-        59: 0,  # 'Ö±'
-        41: 0,  # 'Ö²'
-        33: 0,  # 'Ö´'
-        37: 0,  # 'Öµ'
-        36: 0,  # 'Ö¶'
-        31: 0,  # 'Ö·'
-        29: 0,  # 'Ö¸'
-        35: 0,  # 'Ö¹'
-        62: 0,  # 'Ö»'
-        28: 0,  # 'Ö¼'
-        38: 0,  # '×'
-        45: 0,  # 'ׂ'
-        9: 0,  # '×'
-        8: 2,  # 'ב'
-        20: 1,  # '×’'
-        16: 2,  # 'ד'
-        3: 1,  # '×”'
-        2: 1,  # 'ו'
-        24: 1,  # '×–'
-        14: 1,  # '×—'
-        22: 1,  # 'ט'
-        1: 1,  # '×™'
-        25: 1,  # 'ך'
-        15: 1,  # '×›'
-        4: 2,  # 'ל'
-        11: 0,  # '×'
-        6: 2,  # 'מ'
-        23: 0,  # 'ן'
-        12: 2,  # '× '
-        19: 1,  # 'ס'
-        13: 0,  # '×¢'
-        26: 0,  # '×£'
-        18: 1,  # 'פ'
-        27: 0,  # '×¥'
-        21: 2,  # 'צ'
-        17: 1,  # '×§'
-        7: 2,  # 'ר'
-        10: 2,  # 'ש'
-        5: 1,  # 'ת'
-        32: 0,  # '–'
-        52: 0,  # '’'
-        47: 0,  # '“'
-        46: 0,  # 'â€'
-        58: 0,  # '†'
-        40: 0,  # '…'
-    },
-    33: {  # 'Ö´'
-        50: 0,  # 'a'
-        60: 0,  # 'c'
-        61: 0,  # 'd'
-        42: 0,  # 'e'
-        53: 0,  # 'i'
-        56: 0,  # 'l'
-        54: 0,  # 'n'
-        49: 0,  # 'o'
-        51: 0,  # 'r'
-        43: 0,  # 's'
-        44: 0,  # 't'
-        63: 0,  # 'u'
-        34: 0,  # '\xa0'
-        55: 0,  # '´'
-        48: 0,  # '¼'
-        39: 0,  # '½'
-        57: 0,  # '¾'
-        30: 1,  # 'Ö°'
-        59: 0,  # 'Ö±'
-        41: 0,  # 'Ö²'
-        33: 1,  # 'Ö´'
-        37: 0,  # 'Öµ'
-        36: 1,  # 'Ö¶'
-        31: 0,  # 'Ö·'
-        29: 1,  # 'Ö¸'
-        35: 0,  # 'Ö¹'
-        62: 0,  # 'Ö»'
-        28: 1,  # 'Ö¼'
-        38: 0,  # '×'
-        45: 0,  # 'ׂ'
-        9: 1,  # '×'
-        8: 2,  # 'ב'
-        20: 2,  # '×’'
-        16: 2,  # 'ד'
-        3: 1,  # '×”'
-        2: 1,  # 'ו'
-        24: 2,  # '×–'
-        14: 1,  # '×—'
-        22: 1,  # 'ט'
-        1: 3,  # '×™'
-        25: 1,  # 'ך'
-        15: 2,  # '×›'
-        4: 2,  # 'ל'
-        11: 2,  # '×'
-        6: 2,  # 'מ'
-        23: 2,  # 'ן'
-        12: 2,  # '× '
-        19: 2,  # 'ס'
-        13: 1,  # '×¢'
-        26: 0,  # '×£'
-        18: 2,  # 'פ'
-        27: 1,  # '×¥'
-        21: 2,  # 'צ'
-        17: 2,  # '×§'
-        7: 2,  # 'ר'
-        10: 2,  # 'ש'
-        5: 2,  # 'ת'
-        32: 0,  # '–'
-        52: 0,  # '’'
-        47: 0,  # '“'
-        46: 0,  # 'â€'
-        58: 0,  # '†'
-        40: 0,  # '…'
-    },
-    37: {  # 'Öµ'
-        50: 0,  # 'a'
-        60: 0,  # 'c'
-        61: 0,  # 'd'
-        42: 0,  # 'e'
-        53: 0,  # 'i'
-        56: 0,  # 'l'
-        54: 0,  # 'n'
-        49: 0,  # 'o'
-        51: 0,  # 'r'
-        43: 0,  # 's'
-        44: 0,  # 't'
-        63: 0,  # 'u'
-        34: 0,  # '\xa0'
-        55: 0,  # '´'
-        48: 0,  # '¼'
-        39: 0,  # '½'
-        57: 0,  # '¾'
-        30: 0,  # 'Ö°'
-        59: 0,  # 'Ö±'
-        41: 0,  # 'Ö²'
-        33: 0,  # 'Ö´'
-        37: 0,  # 'Öµ'
-        36: 1,  # 'Ö¶'
-        31: 1,  # 'Ö·'
-        29: 1,  # 'Ö¸'
-        35: 0,  # 'Ö¹'
-        62: 0,  # 'Ö»'
-        28: 0,  # 'Ö¼'
-        38: 0,  # '×'
-        45: 0,  # 'ׂ'
-        9: 2,  # '×'
-        8: 2,  # 'ב'
-        20: 1,  # '×’'
-        16: 2,  # 'ד'
-        3: 2,  # '×”'
-        2: 1,  # 'ו'
-        24: 1,  # '×–'
-        14: 2,  # '×—'
-        22: 1,  # 'ט'
-        1: 3,  # '×™'
-        25: 2,  # 'ך'
-        15: 1,  # '×›'
-        4: 2,  # 'ל'
-        11: 2,  # '×'
-        6: 1,  # 'מ'
-        23: 2,  # 'ן'
-        12: 2,  # '× '
-        19: 1,  # 'ס'
-        13: 2,  # '×¢'
-        26: 1,  # '×£'
-        18: 1,  # 'פ'
-        27: 1,  # '×¥'
-        21: 1,  # 'צ'
-        17: 1,  # '×§'
-        7: 2,  # 'ר'
-        10: 2,  # 'ש'
-        5: 2,  # 'ת'
-        32: 0,  # '–'
-        52: 0,  # '’'
-        47: 0,  # '“'
-        46: 0,  # 'â€'
-        58: 0,  # '†'
-        40: 0,  # '…'
-    },
-    36: {  # 'Ö¶'
-        50: 0,  # 'a'
-        60: 0,  # 'c'
-        61: 0,  # 'd'
-        42: 0,  # 'e'
-        53: 0,  # 'i'
-        56: 0,  # 'l'
-        54: 0,  # 'n'
-        49: 0,  # 'o'
-        51: 0,  # 'r'
-        43: 0,  # 's'
-        44: 0,  # 't'
-        63: 0,  # 'u'
-        34: 0,  # '\xa0'
-        55: 0,  # '´'
-        48: 0,  # '¼'
-        39: 0,  # '½'
-        57: 0,  # '¾'
-        30: 0,  # 'Ö°'
-        59: 0,  # 'Ö±'
-        41: 0,  # 'Ö²'
-        33: 0,  # 'Ö´'
-        37: 0,  # 'Öµ'
-        36: 1,  # 'Ö¶'
-        31: 1,  # 'Ö·'
-        29: 1,  # 'Ö¸'
-        35: 0,  # 'Ö¹'
-        62: 0,  # 'Ö»'
-        28: 0,  # 'Ö¼'
-        38: 0,  # '×'
-        45: 0,  # 'ׂ'
-        9: 2,  # '×'
-        8: 2,  # 'ב'
-        20: 1,  # '×’'
-        16: 2,  # 'ד'
-        3: 2,  # '×”'
-        2: 1,  # 'ו'
-        24: 1,  # '×–'
-        14: 2,  # '×—'
-        22: 1,  # 'ט'
-        1: 2,  # '×™'
-        25: 2,  # 'ך'
-        15: 1,  # '×›'
-        4: 2,  # 'ל'
-        11: 2,  # '×'
-        6: 2,  # 'מ'
-        23: 2,  # 'ן'
-        12: 2,  # '× '
-        19: 2,  # 'ס'
-        13: 1,  # '×¢'
-        26: 1,  # '×£'
-        18: 1,  # 'פ'
-        27: 2,  # '×¥'
-        21: 1,  # 'צ'
-        17: 1,  # '×§'
-        7: 2,  # 'ר'
-        10: 2,  # 'ש'
-        5: 2,  # 'ת'
-        32: 0,  # '–'
-        52: 0,  # '’'
-        47: 0,  # '“'
-        46: 0,  # 'â€'
-        58: 0,  # '†'
-        40: 0,  # '…'
-    },
-    31: {  # 'Ö·'
-        50: 0,  # 'a'
-        60: 0,  # 'c'
-        61: 0,  # 'd'
-        42: 0,  # 'e'
-        53: 0,  # 'i'
-        56: 0,  # 'l'
-        54: 0,  # 'n'
-        49: 0,  # 'o'
-        51: 0,  # 'r'
-        43: 0,  # 's'
-        44: 0,  # 't'
-        63: 0,  # 'u'
-        34: 0,  # '\xa0'
-        55: 0,  # '´'
-        48: 0,  # '¼'
-        39: 0,  # '½'
-        57: 0,  # '¾'
-        30: 1,  # 'Ö°'
-        59: 0,  # 'Ö±'
-        41: 0,  # 'Ö²'
-        33: 0,  # 'Ö´'
-        37: 0,  # 'Öµ'
-        36: 1,  # 'Ö¶'
-        31: 0,  # 'Ö·'
-        29: 2,  # 'Ö¸'
-        35: 0,  # 'Ö¹'
-        62: 0,  # 'Ö»'
-        28: 0,  # 'Ö¼'
-        38: 0,  # '×'
-        45: 0,  # 'ׂ'
-        9: 2,  # '×'
-        8: 2,  # 'ב'
-        20: 2,  # '×’'
-        16: 2,  # 'ד'
-        3: 2,  # '×”'
-        2: 1,  # 'ו'
-        24: 2,  # '×–'
-        14: 2,  # '×—'
-        22: 2,  # 'ט'
-        1: 3,  # '×™'
-        25: 1,  # 'ך'
-        15: 2,  # '×›'
-        4: 2,  # 'ל'
-        11: 2,  # '×'
-        6: 2,  # 'מ'
-        23: 2,  # 'ן'
-        12: 2,  # '× '
-        19: 2,  # 'ס'
-        13: 2,  # '×¢'
-        26: 2,  # '×£'
-        18: 2,  # 'פ'
-        27: 1,  # '×¥'
-        21: 2,  # 'צ'
-        17: 2,  # '×§'
-        7: 2,  # 'ר'
-        10: 2,  # 'ש'
-        5: 2,  # 'ת'
-        32: 0,  # '–'
-        52: 0,  # '’'
-        47: 0,  # '“'
-        46: 0,  # 'â€'
-        58: 0,  # '†'
-        40: 0,  # '…'
-    },
-    29: {  # 'Ö¸'
-        50: 0,  # 'a'
-        60: 0,  # 'c'
-        61: 0,  # 'd'
-        42: 0,  # 'e'
-        53: 0,  # 'i'
-        56: 0,  # 'l'
-        54: 0,  # 'n'
-        49: 0,  # 'o'
-        51: 0,  # 'r'
-        43: 0,  # 's'
-        44: 0,  # 't'
-        63: 0,  # 'u'
-        34: 0,  # '\xa0'
-        55: 0,  # '´'
-        48: 0,  # '¼'
-        39: 0,  # '½'
-        57: 0,  # '¾'
-        30: 0,  # 'Ö°'
-        59: 0,  # 'Ö±'
-        41: 0,  # 'Ö²'
-        33: 0,  # 'Ö´'
-        37: 0,  # 'Öµ'
-        36: 0,  # 'Ö¶'
-        31: 1,  # 'Ö·'
-        29: 2,  # 'Ö¸'
-        35: 0,  # 'Ö¹'
-        62: 0,  # 'Ö»'
-        28: 1,  # 'Ö¼'
-        38: 0,  # '×'
-        45: 0,  # 'ׂ'
-        9: 2,  # '×'
-        8: 2,  # 'ב'
-        20: 2,  # '×’'
-        16: 2,  # 'ד'
-        3: 3,  # '×”'
-        2: 2,  # 'ו'
-        24: 2,  # '×–'
-        14: 2,  # '×—'
-        22: 1,  # 'ט'
-        1: 2,  # '×™'
-        25: 2,  # 'ך'
-        15: 2,  # '×›'
-        4: 2,  # 'ל'
-        11: 2,  # '×'
-        6: 2,  # 'מ'
-        23: 2,  # 'ן'
-        12: 2,  # '× '
-        19: 1,  # 'ס'
-        13: 2,  # '×¢'
-        26: 1,  # '×£'
-        18: 2,  # 'פ'
-        27: 1,  # '×¥'
-        21: 2,  # 'צ'
-        17: 2,  # '×§'
-        7: 2,  # 'ר'
-        10: 2,  # 'ש'
-        5: 2,  # 'ת'
-        32: 0,  # '–'
-        52: 0,  # '’'
-        47: 0,  # '“'
-        46: 0,  # 'â€'
-        58: 0,  # '†'
-        40: 0,  # '…'
-    },
-    35: {  # 'Ö¹'
-        50: 0,  # 'a'
-        60: 0,  # 'c'
-        61: 0,  # 'd'
-        42: 0,  # 'e'
-        53: 0,  # 'i'
-        56: 0,  # 'l'
-        54: 0,  # 'n'
-        49: 0,  # 'o'
-        51: 0,  # 'r'
-        43: 0,  # 's'
-        44: 0,  # 't'
-        63: 0,  # 'u'
-        34: 0,  # '\xa0'
-        55: 0,  # '´'
-        48: 0,  # '¼'
-        39: 0,  # '½'
-        57: 0,  # '¾'
-        30: 0,  # 'Ö°'
-        59: 0,  # 'Ö±'
-        41: 0,  # 'Ö²'
-        33: 0,  # 'Ö´'
-        37: 0,  # 'Öµ'
-        36: 0,  # 'Ö¶'
-        31: 0,  # 'Ö·'
-        29: 0,  # 'Ö¸'
-        35: 1,  # 'Ö¹'
-        62: 0,  # 'Ö»'
-        28: 0,  # 'Ö¼'
-        38: 0,  # '×'
-        45: 0,  # 'ׂ'
-        9: 2,  # '×'
-        8: 2,  # 'ב'
-        20: 1,  # '×’'
-        16: 2,  # 'ד'
-        3: 2,  # '×”'
-        2: 1,  # 'ו'
-        24: 1,  # '×–'
-        14: 1,  # '×—'
-        22: 1,  # 'ט'
-        1: 1,  # '×™'
-        25: 1,  # 'ך'
-        15: 2,  # '×›'
-        4: 2,  # 'ל'
-        11: 2,  # '×'
-        6: 2,  # 'מ'
-        23: 2,  # 'ן'
-        12: 2,  # '× '
-        19: 2,  # 'ס'
-        13: 2,  # '×¢'
-        26: 1,  # '×£'
-        18: 2,  # 'פ'
-        27: 1,  # '×¥'
-        21: 2,  # 'צ'
-        17: 2,  # '×§'
-        7: 2,  # 'ר'
-        10: 2,  # 'ש'
-        5: 2,  # 'ת'
-        32: 0,  # '–'
-        52: 0,  # '’'
-        47: 0,  # '“'
-        46: 0,  # 'â€'
-        58: 0,  # '†'
-        40: 0,  # '…'
-    },
-    62: {  # 'Ö»'
-        50: 0,  # 'a'
-        60: 0,  # 'c'
-        61: 0,  # 'd'
-        42: 0,  # 'e'
-        53: 0,  # 'i'
-        56: 0,  # 'l'
-        54: 0,  # 'n'
-        49: 0,  # 'o'
-        51: 0,  # 'r'
-        43: 0,  # 's'
-        44: 0,  # 't'
-        63: 0,  # 'u'
-        34: 0,  # '\xa0'
-        55: 0,  # '´'
-        48: 0,  # '¼'
-        39: 0,  # '½'
-        57: 0,  # '¾'
-        30: 0,  # 'Ö°'
-        59: 0,  # 'Ö±'
-        41: 0,  # 'Ö²'
-        33: 0,  # 'Ö´'
-        37: 0,  # 'Öµ'
-        36: 0,  # 'Ö¶'
-        31: 0,  # 'Ö·'
-        29: 0,  # 'Ö¸'
-        35: 0,  # 'Ö¹'
-        62: 0,  # 'Ö»'
-        28: 0,  # 'Ö¼'
-        38: 0,  # '×'
-        45: 0,  # 'ׂ'
-        9: 0,  # '×'
-        8: 1,  # 'ב'
-        20: 1,  # '×’'
-        16: 1,  # 'ד'
-        3: 1,  # '×”'
-        2: 1,  # 'ו'
-        24: 1,  # '×–'
-        14: 1,  # '×—'
-        22: 0,  # 'ט'
-        1: 1,  # '×™'
-        25: 0,  # 'ך'
-        15: 1,  # '×›'
-        4: 2,  # 'ל'
-        11: 1,  # '×'
-        6: 1,  # 'מ'
-        23: 1,  # 'ן'
-        12: 1,  # '× '
-        19: 1,  # 'ס'
-        13: 1,  # '×¢'
-        26: 0,  # '×£'
-        18: 1,  # 'פ'
-        27: 0,  # '×¥'
-        21: 1,  # 'צ'
-        17: 1,  # '×§'
-        7: 1,  # 'ר'
-        10: 1,  # 'ש'
-        5: 1,  # 'ת'
-        32: 0,  # '–'
-        52: 0,  # '’'
-        47: 0,  # '“'
-        46: 0,  # 'â€'
-        58: 0,  # '†'
-        40: 0,  # '…'
-    },
-    28: {  # 'Ö¼'
-        50: 0,  # 'a'
-        60: 0,  # 'c'
-        61: 0,  # 'd'
-        42: 0,  # 'e'
-        53: 0,  # 'i'
-        56: 0,  # 'l'
-        54: 0,  # 'n'
-        49: 0,  # 'o'
-        51: 0,  # 'r'
-        43: 0,  # 's'
-        44: 0,  # 't'
-        63: 0,  # 'u'
-        34: 0,  # '\xa0'
-        55: 0,  # '´'
-        48: 0,  # '¼'
-        39: 0,  # '½'
-        57: 0,  # '¾'
-        30: 3,  # 'Ö°'
-        59: 0,  # 'Ö±'
-        41: 1,  # 'Ö²'
-        33: 3,  # 'Ö´'
-        37: 2,  # 'Öµ'
-        36: 2,  # 'Ö¶'
-        31: 3,  # 'Ö·'
-        29: 3,  # 'Ö¸'
-        35: 2,  # 'Ö¹'
-        62: 1,  # 'Ö»'
-        28: 0,  # 'Ö¼'
-        38: 2,  # '×'
-        45: 1,  # 'ׂ'
-        9: 2,  # '×'
-        8: 2,  # 'ב'
-        20: 1,  # '×’'
-        16: 2,  # 'ד'
-        3: 1,  # '×”'
-        2: 2,  # 'ו'
-        24: 1,  # '×–'
-        14: 1,  # '×—'
-        22: 1,  # 'ט'
-        1: 2,  # '×™'
-        25: 2,  # 'ך'
-        15: 2,  # '×›'
-        4: 2,  # 'ל'
-        11: 1,  # '×'
-        6: 2,  # 'מ'
-        23: 1,  # 'ן'
-        12: 2,  # '× '
-        19: 1,  # 'ס'
-        13: 2,  # '×¢'
-        26: 1,  # '×£'
-        18: 1,  # 'פ'
-        27: 1,  # '×¥'
-        21: 1,  # 'צ'
-        17: 1,  # '×§'
-        7: 2,  # 'ר'
-        10: 2,  # 'ש'
-        5: 2,  # 'ת'
-        32: 0,  # '–'
-        52: 0,  # '’'
-        47: 0,  # '“'
-        46: 0,  # 'â€'
-        58: 0,  # '†'
-        40: 0,  # '…'
-    },
-    38: {  # '×'
-        50: 0,  # 'a'
-        60: 0,  # 'c'
-        61: 0,  # 'd'
-        42: 0,  # 'e'
-        53: 0,  # 'i'
-        56: 0,  # 'l'
-        54: 0,  # 'n'
-        49: 0,  # 'o'
-        51: 0,  # 'r'
-        43: 0,  # 's'
-        44: 0,  # 't'
-        63: 0,  # 'u'
-        34: 0,  # '\xa0'
-        55: 0,  # '´'
-        48: 0,  # '¼'
-        39: 0,  # '½'
-        57: 0,  # '¾'
-        30: 2,  # 'Ö°'
-        59: 0,  # 'Ö±'
-        41: 0,  # 'Ö²'
-        33: 2,  # 'Ö´'
-        37: 2,  # 'Öµ'
-        36: 2,  # 'Ö¶'
-        31: 2,  # 'Ö·'
-        29: 2,  # 'Ö¸'
-        35: 1,  # 'Ö¹'
-        62: 1,  # 'Ö»'
-        28: 0,  # 'Ö¼'
-        38: 0,  # '×'
-        45: 0,  # 'ׂ'
-        9: 0,  # '×'
-        8: 0,  # 'ב'
-        20: 0,  # '×’'
-        16: 0,  # 'ד'
-        3: 0,  # '×”'
-        2: 2,  # 'ו'
-        24: 0,  # '×–'
-        14: 0,  # '×—'
-        22: 0,  # 'ט'
-        1: 1,  # '×™'
-        25: 0,  # 'ך'
-        15: 0,  # '×›'
-        4: 0,  # 'ל'
-        11: 0,  # '×'
-        6: 0,  # 'מ'
-        23: 0,  # 'ן'
-        12: 0,  # '× '
-        19: 0,  # 'ס'
-        13: 1,  # '×¢'
-        26: 0,  # '×£'
-        18: 0,  # 'פ'
-        27: 0,  # '×¥'
-        21: 0,  # 'צ'
-        17: 0,  # '×§'
-        7: 0,  # 'ר'
-        10: 0,  # 'ש'
-        5: 0,  # 'ת'
-        32: 0,  # '–'
-        52: 0,  # '’'
-        47: 0,  # '“'
-        46: 0,  # 'â€'
-        58: 0,  # '†'
-        40: 0,  # '…'
-    },
-    45: {  # 'ׂ'
-        50: 0,  # 'a'
-        60: 0,  # 'c'
-        61: 0,  # 'd'
-        42: 0,  # 'e'
-        53: 0,  # 'i'
-        56: 0,  # 'l'
-        54: 0,  # 'n'
-        49: 0,  # 'o'
-        51: 0,  # 'r'
-        43: 0,  # 's'
-        44: 0,  # 't'
-        63: 0,  # 'u'
-        34: 0,  # '\xa0'
-        55: 0,  # '´'
-        48: 0,  # '¼'
-        39: 0,  # '½'
-        57: 0,  # '¾'
-        30: 2,  # 'Ö°'
-        59: 0,  # 'Ö±'
-        41: 0,  # 'Ö²'
-        33: 2,  # 'Ö´'
-        37: 1,  # 'Öµ'
-        36: 2,  # 'Ö¶'
-        31: 1,  # 'Ö·'
-        29: 2,  # 'Ö¸'
-        35: 1,  # 'Ö¹'
-        62: 0,  # 'Ö»'
-        28: 0,  # 'Ö¼'
-        38: 0,  # '×'
-        45: 0,  # 'ׂ'
-        9: 1,  # '×'
-        8: 0,  # 'ב'
-        20: 1,  # '×’'
-        16: 0,  # 'ד'
-        3: 1,  # '×”'
-        2: 2,  # 'ו'
-        24: 0,  # '×–'
-        14: 1,  # '×—'
-        22: 0,  # 'ט'
-        1: 1,  # '×™'
-        25: 0,  # 'ך'
-        15: 0,  # '×›'
-        4: 0,  # 'ל'
-        11: 1,  # '×'
-        6: 1,  # 'מ'
-        23: 0,  # 'ן'
-        12: 1,  # '× '
-        19: 0,  # 'ס'
-        13: 1,  # '×¢'
-        26: 0,  # '×£'
-        18: 1,  # 'פ'
-        27: 0,  # '×¥'
-        21: 0,  # 'צ'
-        17: 0,  # '×§'
-        7: 1,  # 'ר'
-        10: 0,  # 'ש'
-        5: 1,  # 'ת'
-        32: 0,  # '–'
-        52: 0,  # '’'
-        47: 0,  # '“'
-        46: 0,  # 'â€'
-        58: 0,  # '†'
-        40: 0,  # '…'
-    },
-    9: {  # '×'
-        50: 0,  # 'a'
-        60: 0,  # 'c'
-        61: 0,  # 'd'
-        42: 0,  # 'e'
-        53: 0,  # 'i'
-        56: 0,  # 'l'
-        54: 0,  # 'n'
-        49: 0,  # 'o'
-        51: 0,  # 'r'
-        43: 0,  # 's'
-        44: 0,  # 't'
-        63: 0,  # 'u'
-        34: 1,  # '\xa0'
-        55: 1,  # '´'
-        48: 1,  # '¼'
-        39: 0,  # '½'
-        57: 0,  # '¾'
-        30: 0,  # 'Ö°'
-        59: 2,  # 'Ö±'
-        41: 2,  # 'Ö²'
-        33: 2,  # 'Ö´'
-        37: 2,  # 'Öµ'
-        36: 2,  # 'Ö¶'
-        31: 2,  # 'Ö·'
-        29: 2,  # 'Ö¸'
-        35: 2,  # 'Ö¹'
-        62: 1,  # 'Ö»'
-        28: 0,  # 'Ö¼'
-        38: 0,  # '×'
-        45: 0,  # 'ׂ'
-        9: 2,  # '×'
-        8: 3,  # 'ב'
-        20: 3,  # '×’'
-        16: 3,  # 'ד'
-        3: 3,  # '×”'
-        2: 3,  # 'ו'
-        24: 3,  # '×–'
-        14: 3,  # '×—'
-        22: 3,  # 'ט'
-        1: 3,  # '×™'
-        25: 3,  # 'ך'
-        15: 3,  # '×›'
-        4: 3,  # 'ל'
-        11: 3,  # '×'
-        6: 3,  # 'מ'
-        23: 3,  # 'ן'
-        12: 3,  # '× '
-        19: 3,  # 'ס'
-        13: 2,  # '×¢'
-        26: 3,  # '×£'
-        18: 3,  # 'פ'
-        27: 1,  # '×¥'
-        21: 3,  # 'צ'
-        17: 3,  # '×§'
-        7: 3,  # 'ר'
-        10: 3,  # 'ש'
-        5: 3,  # 'ת'
-        32: 0,  # '–'
-        52: 0,  # '’'
-        47: 0,  # '“'
-        46: 1,  # 'â€'
-        58: 0,  # '†'
-        40: 1,  # '…'
-    },
-    8: {  # 'ב'
-        50: 0,  # 'a'
-        60: 0,  # 'c'
-        61: 1,  # 'd'
-        42: 0,  # 'e'
-        53: 0,  # 'i'
-        56: 0,  # 'l'
-        54: 0,  # 'n'
-        49: 0,  # 'o'
-        51: 0,  # 'r'
-        43: 0,  # 's'
-        44: 0,  # 't'
-        63: 0,  # 'u'
-        34: 1,  # '\xa0'
-        55: 1,  # '´'
-        48: 0,  # '¼'
-        39: 0,  # '½'
-        57: 0,  # '¾'
-        30: 2,  # 'Ö°'
-        59: 0,  # 'Ö±'
-        41: 0,  # 'Ö²'
-        33: 2,  # 'Ö´'
-        37: 2,  # 'Öµ'
-        36: 2,  # 'Ö¶'
-        31: 2,  # 'Ö·'
-        29: 2,  # 'Ö¸'
-        35: 2,  # 'Ö¹'
-        62: 1,  # 'Ö»'
-        28: 3,  # 'Ö¼'
-        38: 0,  # '×'
-        45: 0,  # 'ׂ'
-        9: 3,  # '×'
-        8: 3,  # 'ב'
-        20: 3,  # '×’'
-        16: 3,  # 'ד'
-        3: 3,  # '×”'
-        2: 3,  # 'ו'
-        24: 3,  # '×–'
-        14: 3,  # '×—'
-        22: 3,  # 'ט'
-        1: 3,  # '×™'
-        25: 2,  # 'ך'
-        15: 3,  # '×›'
-        4: 3,  # 'ל'
-        11: 2,  # '×'
-        6: 3,  # 'מ'
-        23: 3,  # 'ן'
-        12: 3,  # '× '
-        19: 3,  # 'ס'
-        13: 3,  # '×¢'
-        26: 1,  # '×£'
-        18: 3,  # 'פ'
-        27: 2,  # '×¥'
-        21: 3,  # 'צ'
-        17: 3,  # '×§'
-        7: 3,  # 'ר'
-        10: 3,  # 'ש'
-        5: 3,  # 'ת'
-        32: 1,  # '–'
-        52: 0,  # '’'
-        47: 0,  # '“'
-        46: 1,  # 'â€'
-        58: 0,  # '†'
-        40: 1,  # '…'
-    },
-    20: {  # '×’'
-        50: 0,  # 'a'
-        60: 0,  # 'c'
-        61: 0,  # 'd'
-        42: 0,  # 'e'
-        53: 0,  # 'i'
-        56: 0,  # 'l'
-        54: 0,  # 'n'
-        49: 0,  # 'o'
-        51: 0,  # 'r'
-        43: 0,  # 's'
-        44: 0,  # 't'
-        63: 0,  # 'u'
-        34: 1,  # '\xa0'
-        55: 2,  # '´'
-        48: 0,  # '¼'
-        39: 0,  # '½'
-        57: 0,  # '¾'
-        30: 2,  # 'Ö°'
-        59: 0,  # 'Ö±'
-        41: 0,  # 'Ö²'
-        33: 1,  # 'Ö´'
-        37: 1,  # 'Öµ'
-        36: 1,  # 'Ö¶'
-        31: 2,  # 'Ö·'
-        29: 2,  # 'Ö¸'
-        35: 1,  # 'Ö¹'
-        62: 0,  # 'Ö»'
-        28: 2,  # 'Ö¼'
-        38: 0,  # '×'
-        45: 0,  # 'ׂ'
-        9: 2,  # '×'
-        8: 3,  # 'ב'
-        20: 2,  # '×’'
-        16: 3,  # 'ד'
-        3: 3,  # '×”'
-        2: 3,  # 'ו'
-        24: 3,  # '×–'
-        14: 2,  # '×—'
-        22: 2,  # 'ט'
-        1: 3,  # '×™'
-        25: 1,  # 'ך'
-        15: 1,  # '×›'
-        4: 3,  # 'ל'
-        11: 3,  # '×'
-        6: 3,  # 'מ'
-        23: 3,  # 'ן'
-        12: 3,  # '× '
-        19: 2,  # 'ס'
-        13: 3,  # '×¢'
-        26: 2,  # '×£'
-        18: 2,  # 'פ'
-        27: 1,  # '×¥'
-        21: 1,  # 'צ'
-        17: 1,  # '×§'
-        7: 3,  # 'ר'
-        10: 3,  # 'ש'
-        5: 3,  # 'ת'
-        32: 0,  # '–'
-        52: 1,  # '’'
-        47: 0,  # '“'
-        46: 1,  # 'â€'
-        58: 0,  # '†'
-        40: 0,  # '…'
-    },
-    16: {  # 'ד'
-        50: 0,  # 'a'
-        60: 0,  # 'c'
-        61: 0,  # 'd'
-        42: 0,  # 'e'
-        53: 0,  # 'i'
-        56: 0,  # 'l'
-        54: 0,  # 'n'
-        49: 0,  # 'o'
-        51: 0,  # 'r'
-        43: 0,  # 's'
-        44: 0,  # 't'
-        63: 0,  # 'u'
-        34: 0,  # '\xa0'
-        55: 0,  # '´'
-        48: 0,  # '¼'
-        39: 0,  # '½'
-        57: 0,  # '¾'
-        30: 2,  # 'Ö°'
-        59: 0,  # 'Ö±'
-        41: 0,  # 'Ö²'
-        33: 2,  # 'Ö´'
-        37: 2,  # 'Öµ'
-        36: 2,  # 'Ö¶'
-        31: 2,  # 'Ö·'
-        29: 2,  # 'Ö¸'
-        35: 2,  # 'Ö¹'
-        62: 1,  # 'Ö»'
-        28: 2,  # 'Ö¼'
-        38: 0,  # '×'
-        45: 0,  # 'ׂ'
-        9: 3,  # '×'
-        8: 3,  # 'ב'
-        20: 3,  # '×’'
-        16: 3,  # 'ד'
-        3: 3,  # '×”'
-        2: 3,  # 'ו'
-        24: 1,  # '×–'
-        14: 2,  # '×—'
-        22: 2,  # 'ט'
-        1: 3,  # '×™'
-        25: 2,  # 'ך'
-        15: 2,  # '×›'
-        4: 3,  # 'ל'
-        11: 3,  # '×'
-        6: 3,  # 'מ'
-        23: 2,  # 'ן'
-        12: 3,  # '× '
-        19: 2,  # 'ס'
-        13: 3,  # '×¢'
-        26: 2,  # '×£'
-        18: 3,  # 'פ'
-        27: 0,  # '×¥'
-        21: 2,  # 'צ'
-        17: 3,  # '×§'
-        7: 3,  # 'ר'
-        10: 3,  # 'ש'
-        5: 3,  # 'ת'
-        32: 0,  # '–'
-        52: 0,  # '’'
-        47: 0,  # '“'
-        46: 1,  # 'â€'
-        58: 0,  # '†'
-        40: 1,  # '…'
-    },
-    3: {  # '×”'
-        50: 0,  # 'a'
-        60: 0,  # 'c'
-        61: 1,  # 'd'
-        42: 0,  # 'e'
-        53: 0,  # 'i'
-        56: 0,  # 'l'
-        54: 0,  # 'n'
-        49: 0,  # 'o'
-        51: 0,  # 'r'
-        43: 0,  # 's'
-        44: 0,  # 't'
-        63: 0,  # 'u'
-        34: 1,  # '\xa0'
-        55: 0,  # '´'
-        48: 1,  # '¼'
-        39: 0,  # '½'
-        57: 0,  # '¾'
-        30: 1,  # 'Ö°'
-        59: 1,  # 'Ö±'
-        41: 2,  # 'Ö²'
-        33: 2,  # 'Ö´'
-        37: 2,  # 'Öµ'
-        36: 2,  # 'Ö¶'
-        31: 3,  # 'Ö·'
-        29: 2,  # 'Ö¸'
-        35: 1,  # 'Ö¹'
-        62: 1,  # 'Ö»'
-        28: 2,  # 'Ö¼'
-        38: 0,  # '×'
-        45: 0,  # 'ׂ'
-        9: 3,  # '×'
-        8: 3,  # 'ב'
-        20: 3,  # '×’'
-        16: 3,  # 'ד'
-        3: 3,  # '×”'
-        2: 3,  # 'ו'
-        24: 3,  # '×–'
-        14: 3,  # '×—'
-        22: 3,  # 'ט'
-        1: 3,  # '×™'
-        25: 1,  # 'ך'
-        15: 3,  # '×›'
-        4: 3,  # 'ל'
-        11: 3,  # '×'
-        6: 3,  # 'מ'
-        23: 3,  # 'ן'
-        12: 3,  # '× '
-        19: 3,  # 'ס'
-        13: 3,  # '×¢'
-        26: 0,  # '×£'
-        18: 3,  # 'פ'
-        27: 1,  # '×¥'
-        21: 3,  # 'צ'
-        17: 3,  # '×§'
-        7: 3,  # 'ר'
-        10: 3,  # 'ש'
-        5: 3,  # 'ת'
-        32: 1,  # '–'
-        52: 1,  # '’'
-        47: 0,  # '“'
-        46: 1,  # 'â€'
-        58: 0,  # '†'
-        40: 2,  # '…'
-    },
-    2: {  # 'ו'
-        50: 0,  # 'a'
-        60: 0,  # 'c'
-        61: 0,  # 'd'
-        42: 0,  # 'e'
-        53: 0,  # 'i'
-        56: 0,  # 'l'
-        54: 0,  # 'n'
-        49: 0,  # 'o'
-        51: 0,  # 'r'
-        43: 0,  # 's'
-        44: 1,  # 't'
-        63: 0,  # 'u'
-        34: 1,  # '\xa0'
-        55: 1,  # '´'
-        48: 1,  # '¼'
-        39: 0,  # '½'
-        57: 0,  # '¾'
-        30: 2,  # 'Ö°'
-        59: 0,  # 'Ö±'
-        41: 0,  # 'Ö²'
-        33: 2,  # 'Ö´'
-        37: 1,  # 'Öµ'
-        36: 1,  # 'Ö¶'
-        31: 2,  # 'Ö·'
-        29: 2,  # 'Ö¸'
-        35: 3,  # 'Ö¹'
-        62: 0,  # 'Ö»'
-        28: 3,  # 'Ö¼'
-        38: 0,  # '×'
-        45: 0,  # 'ׂ'
-        9: 3,  # '×'
-        8: 3,  # 'ב'
-        20: 3,  # '×’'
-        16: 3,  # 'ד'
-        3: 3,  # '×”'
-        2: 3,  # 'ו'
-        24: 3,  # '×–'
-        14: 3,  # '×—'
-        22: 3,  # 'ט'
-        1: 3,  # '×™'
-        25: 3,  # 'ך'
-        15: 3,  # '×›'
-        4: 3,  # 'ל'
-        11: 3,  # '×'
-        6: 3,  # 'מ'
-        23: 3,  # 'ן'
-        12: 3,  # '× '
-        19: 3,  # 'ס'
-        13: 3,  # '×¢'
-        26: 3,  # '×£'
-        18: 3,  # 'פ'
-        27: 3,  # '×¥'
-        21: 3,  # 'צ'
-        17: 3,  # '×§'
-        7: 3,  # 'ר'
-        10: 3,  # 'ש'
-        5: 3,  # 'ת'
-        32: 1,  # '–'
-        52: 0,  # '’'
-        47: 0,  # '“'
-        46: 1,  # 'â€'
-        58: 0,  # '†'
-        40: 2,  # '…'
-    },
-    24: {  # '×–'
-        50: 0,  # 'a'
-        60: 0,  # 'c'
-        61: 0,  # 'd'
-        42: 0,  # 'e'
-        53: 0,  # 'i'
-        56: 0,  # 'l'
-        54: 0,  # 'n'
-        49: 0,  # 'o'
-        51: 0,  # 'r'
-        43: 0,  # 's'
-        44: 0,  # 't'
-        63: 0,  # 'u'
-        34: 0,  # '\xa0'
-        55: 1,  # '´'
-        48: 0,  # '¼'
-        39: 0,  # '½'
-        57: 0,  # '¾'
-        30: 2,  # 'Ö°'
-        59: 0,  # 'Ö±'
-        41: 1,  # 'Ö²'
-        33: 1,  # 'Ö´'
-        37: 2,  # 'Öµ'
-        36: 2,  # 'Ö¶'
-        31: 2,  # 'Ö·'
-        29: 2,  # 'Ö¸'
-        35: 1,  # 'Ö¹'
-        62: 1,  # 'Ö»'
-        28: 2,  # 'Ö¼'
-        38: 0,  # '×'
-        45: 0,  # 'ׂ'
-        9: 3,  # '×'
-        8: 2,  # 'ב'
-        20: 2,  # '×’'
-        16: 2,  # 'ד'
-        3: 3,  # '×”'
-        2: 3,  # 'ו'
-        24: 2,  # '×–'
-        14: 2,  # '×—'
-        22: 1,  # 'ט'
-        1: 3,  # '×™'
-        25: 1,  # 'ך'
-        15: 3,  # '×›'
-        4: 3,  # 'ל'
-        11: 2,  # '×'
-        6: 3,  # 'מ'
-        23: 2,  # 'ן'
-        12: 2,  # '× '
-        19: 1,  # 'ס'
-        13: 2,  # '×¢'
-        26: 1,  # '×£'
-        18: 1,  # 'פ'
-        27: 0,  # '×¥'
-        21: 2,  # 'צ'
-        17: 3,  # '×§'
-        7: 3,  # 'ר'
-        10: 1,  # 'ש'
-        5: 2,  # 'ת'
-        32: 0,  # '–'
-        52: 0,  # '’'
-        47: 0,  # '“'
-        46: 0,  # 'â€'
-        58: 0,  # '†'
-        40: 1,  # '…'
-    },
-    14: {  # '×—'
-        50: 0,  # 'a'
-        60: 0,  # 'c'
-        61: 0,  # 'd'
-        42: 0,  # 'e'
-        53: 0,  # 'i'
-        56: 0,  # 'l'
-        54: 0,  # 'n'
-        49: 0,  # 'o'
-        51: 0,  # 'r'
-        43: 0,  # 's'
-        44: 0,  # 't'
-        63: 0,  # 'u'
-        34: 1,  # '\xa0'
-        55: 1,  # '´'
-        48: 0,  # '¼'
-        39: 0,  # '½'
-        57: 0,  # '¾'
-        30: 2,  # 'Ö°'
-        59: 1,  # 'Ö±'
-        41: 2,  # 'Ö²'
-        33: 2,  # 'Ö´'
-        37: 2,  # 'Öµ'
-        36: 2,  # 'Ö¶'
-        31: 2,  # 'Ö·'
-        29: 2,  # 'Ö¸'
-        35: 2,  # 'Ö¹'
-        62: 1,  # 'Ö»'
-        28: 0,  # 'Ö¼'
-        38: 0,  # '×'
-        45: 0,  # 'ׂ'
-        9: 2,  # '×'
-        8: 3,  # 'ב'
-        20: 2,  # '×’'
-        16: 3,  # 'ד'
-        3: 3,  # '×”'
-        2: 3,  # 'ו'
-        24: 3,  # '×–'
-        14: 2,  # '×—'
-        22: 2,  # 'ט'
-        1: 3,  # '×™'
-        25: 1,  # 'ך'
-        15: 2,  # '×›'
-        4: 3,  # 'ל'
-        11: 3,  # '×'
-        6: 3,  # 'מ'
-        23: 2,  # 'ן'
-        12: 3,  # '× '
-        19: 3,  # 'ס'
-        13: 1,  # '×¢'
-        26: 2,  # '×£'
-        18: 2,  # 'פ'
-        27: 2,  # '×¥'
-        21: 3,  # 'צ'
-        17: 3,  # '×§'
-        7: 3,  # 'ר'
-        10: 3,  # 'ש'
-        5: 3,  # 'ת'
-        32: 0,  # '–'
-        52: 1,  # '’'
-        47: 0,  # '“'
-        46: 1,  # 'â€'
-        58: 0,  # '†'
-        40: 1,  # '…'
-    },
-    22: {  # 'ט'
-        50: 0,  # 'a'
-        60: 0,  # 'c'
-        61: 0,  # 'd'
-        42: 0,  # 'e'
-        53: 0,  # 'i'
-        56: 0,  # 'l'
-        54: 0,  # 'n'
-        49: 0,  # 'o'
-        51: 0,  # 'r'
-        43: 0,  # 's'
-        44: 0,  # 't'
-        63: 0,  # 'u'
-        34: 1,  # '\xa0'
-        55: 0,  # '´'
-        48: 0,  # '¼'
-        39: 0,  # '½'
-        57: 0,  # '¾'
-        30: 2,  # 'Ö°'
-        59: 0,  # 'Ö±'
-        41: 0,  # 'Ö²'
-        33: 2,  # 'Ö´'
-        37: 1,  # 'Öµ'
-        36: 1,  # 'Ö¶'
-        31: 2,  # 'Ö·'
-        29: 1,  # 'Ö¸'
-        35: 1,  # 'Ö¹'
-        62: 1,  # 'Ö»'
-        28: 1,  # 'Ö¼'
-        38: 0,  # '×'
-        45: 0,  # 'ׂ'
-        9: 3,  # '×'
-        8: 3,  # 'ב'
-        20: 3,  # '×’'
-        16: 1,  # 'ד'
-        3: 3,  # '×”'
-        2: 3,  # 'ו'
-        24: 2,  # '×–'
-        14: 3,  # '×—'
-        22: 2,  # 'ט'
-        1: 3,  # '×™'
-        25: 1,  # 'ך'
-        15: 2,  # '×›'
-        4: 3,  # 'ל'
-        11: 2,  # '×'
-        6: 2,  # 'מ'
-        23: 2,  # 'ן'
-        12: 3,  # '× '
-        19: 2,  # 'ס'
-        13: 3,  # '×¢'
-        26: 2,  # '×£'
-        18: 3,  # 'פ'
-        27: 1,  # '×¥'
-        21: 2,  # 'צ'
-        17: 2,  # '×§'
-        7: 3,  # 'ר'
-        10: 2,  # 'ש'
-        5: 3,  # 'ת'
-        32: 0,  # '–'
-        52: 0,  # '’'
-        47: 0,  # '“'
-        46: 0,  # 'â€'
-        58: 0,  # '†'
-        40: 1,  # '…'
-    },
-    1: {  # '×™'
-        50: 0,  # 'a'
-        60: 0,  # 'c'
-        61: 0,  # 'd'
-        42: 0,  # 'e'
-        53: 0,  # 'i'
-        56: 0,  # 'l'
-        54: 0,  # 'n'
-        49: 0,  # 'o'
-        51: 0,  # 'r'
-        43: 0,  # 's'
-        44: 0,  # 't'
-        63: 0,  # 'u'
-        34: 1,  # '\xa0'
-        55: 1,  # '´'
-        48: 1,  # '¼'
-        39: 0,  # '½'
-        57: 0,  # '¾'
-        30: 2,  # 'Ö°'
-        59: 0,  # 'Ö±'
-        41: 0,  # 'Ö²'
-        33: 2,  # 'Ö´'
-        37: 2,  # 'Öµ'
-        36: 1,  # 'Ö¶'
-        31: 2,  # 'Ö·'
-        29: 2,  # 'Ö¸'
-        35: 2,  # 'Ö¹'
-        62: 1,  # 'Ö»'
-        28: 2,  # 'Ö¼'
-        38: 0,  # '×'
-        45: 0,  # 'ׂ'
-        9: 3,  # '×'
-        8: 3,  # 'ב'
-        20: 3,  # '×’'
-        16: 3,  # 'ד'
-        3: 3,  # '×”'
-        2: 3,  # 'ו'
-        24: 3,  # '×–'
-        14: 3,  # '×—'
-        22: 3,  # 'ט'
-        1: 3,  # '×™'
-        25: 3,  # 'ך'
-        15: 3,  # '×›'
-        4: 3,  # 'ל'
-        11: 3,  # '×'
-        6: 3,  # 'מ'
-        23: 3,  # 'ן'
-        12: 3,  # '× '
-        19: 3,  # 'ס'
-        13: 3,  # '×¢'
-        26: 3,  # '×£'
-        18: 3,  # 'פ'
-        27: 3,  # '×¥'
-        21: 3,  # 'צ'
-        17: 3,  # '×§'
-        7: 3,  # 'ר'
-        10: 3,  # 'ש'
-        5: 3,  # 'ת'
-        32: 1,  # '–'
-        52: 0,  # '’'
-        47: 0,  # '“'
-        46: 1,  # 'â€'
-        58: 0,  # '†'
-        40: 2,  # '…'
-    },
-    25: {  # 'ך'
-        50: 0,  # 'a'
-        60: 0,  # 'c'
-        61: 0,  # 'd'
-        42: 0,  # 'e'
-        53: 0,  # 'i'
-        56: 0,  # 'l'
-        54: 0,  # 'n'
-        49: 0,  # 'o'
-        51: 0,  # 'r'
-        43: 0,  # 's'
-        44: 0,  # 't'
-        63: 0,  # 'u'
-        34: 0,  # '\xa0'
-        55: 0,  # '´'
-        48: 0,  # '¼'
-        39: 0,  # '½'
-        57: 0,  # '¾'
-        30: 2,  # 'Ö°'
-        59: 0,  # 'Ö±'
-        41: 0,  # 'Ö²'
-        33: 0,  # 'Ö´'
-        37: 0,  # 'Öµ'
-        36: 0,  # 'Ö¶'
-        31: 0,  # 'Ö·'
-        29: 2,  # 'Ö¸'
-        35: 0,  # 'Ö¹'
-        62: 0,  # 'Ö»'
-        28: 1,  # 'Ö¼'
-        38: 0,  # '×'
-        45: 0,  # 'ׂ'
-        9: 1,  # '×'
-        8: 0,  # 'ב'
-        20: 0,  # '×’'
-        16: 0,  # 'ד'
-        3: 1,  # '×”'
-        2: 0,  # 'ו'
-        24: 0,  # '×–'
-        14: 1,  # '×—'
-        22: 0,  # 'ט'
-        1: 0,  # '×™'
-        25: 0,  # 'ך'
-        15: 0,  # '×›'
-        4: 1,  # 'ל'
-        11: 0,  # '×'
-        6: 1,  # 'מ'
-        23: 0,  # 'ן'
-        12: 0,  # '× '
-        19: 0,  # 'ס'
-        13: 0,  # '×¢'
-        26: 0,  # '×£'
-        18: 0,  # 'פ'
-        27: 0,  # '×¥'
-        21: 0,  # 'צ'
-        17: 0,  # '×§'
-        7: 0,  # 'ר'
-        10: 1,  # 'ש'
-        5: 0,  # 'ת'
-        32: 0,  # '–'
-        52: 0,  # '’'
-        47: 0,  # '“'
-        46: 0,  # 'â€'
-        58: 0,  # '†'
-        40: 1,  # '…'
-    },
-    15: {  # '×›'
-        50: 0,  # 'a'
-        60: 0,  # 'c'
-        61: 0,  # 'd'
-        42: 0,  # 'e'
-        53: 0,  # 'i'
-        56: 0,  # 'l'
-        54: 0,  # 'n'
-        49: 0,  # 'o'
-        51: 0,  # 'r'
-        43: 0,  # 's'
-        44: 0,  # 't'
-        63: 0,  # 'u'
-        34: 0,  # '\xa0'
-        55: 0,  # '´'
-        48: 0,  # '¼'
-        39: 0,  # '½'
-        57: 0,  # '¾'
-        30: 2,  # 'Ö°'
-        59: 0,  # 'Ö±'
-        41: 0,  # 'Ö²'
-        33: 2,  # 'Ö´'
-        37: 2,  # 'Öµ'
-        36: 2,  # 'Ö¶'
-        31: 2,  # 'Ö·'
-        29: 2,  # 'Ö¸'
-        35: 1,  # 'Ö¹'
-        62: 1,  # 'Ö»'
-        28: 3,  # 'Ö¼'
-        38: 0,  # '×'
-        45: 0,  # 'ׂ'
-        9: 3,  # '×'
-        8: 3,  # 'ב'
-        20: 2,  # '×’'
-        16: 3,  # 'ד'
-        3: 3,  # '×”'
-        2: 3,  # 'ו'
-        24: 3,  # '×–'
-        14: 3,  # '×—'
-        22: 2,  # 'ט'
-        1: 3,  # '×™'
-        25: 3,  # 'ך'
-        15: 3,  # '×›'
-        4: 3,  # 'ל'
-        11: 3,  # '×'
-        6: 3,  # 'מ'
-        23: 3,  # 'ן'
-        12: 3,  # '× '
-        19: 3,  # 'ס'
-        13: 2,  # '×¢'
-        26: 3,  # '×£'
-        18: 3,  # 'פ'
-        27: 1,  # '×¥'
-        21: 2,  # 'צ'
-        17: 2,  # '×§'
-        7: 3,  # 'ר'
-        10: 3,  # 'ש'
-        5: 3,  # 'ת'
-        32: 0,  # '–'
-        52: 0,  # '’'
-        47: 0,  # '“'
-        46: 0,  # 'â€'
-        58: 0,  # '†'
-        40: 0,  # '…'
-    },
-    4: {  # 'ל'
-        50: 0,  # 'a'
-        60: 0,  # 'c'
-        61: 0,  # 'd'
-        42: 0,  # 'e'
-        53: 0,  # 'i'
-        56: 0,  # 'l'
-        54: 0,  # 'n'
-        49: 0,  # 'o'
-        51: 0,  # 'r'
-        43: 0,  # 's'
-        44: 0,  # 't'
-        63: 0,  # 'u'
-        34: 1,  # '\xa0'
-        55: 1,  # '´'
-        48: 0,  # '¼'
-        39: 0,  # '½'
-        57: 0,  # '¾'
-        30: 3,  # 'Ö°'
-        59: 0,  # 'Ö±'
-        41: 0,  # 'Ö²'
-        33: 2,  # 'Ö´'
-        37: 2,  # 'Öµ'
-        36: 2,  # 'Ö¶'
-        31: 2,  # 'Ö·'
-        29: 2,  # 'Ö¸'
-        35: 2,  # 'Ö¹'
-        62: 1,  # 'Ö»'
-        28: 2,  # 'Ö¼'
-        38: 0,  # '×'
-        45: 0,  # 'ׂ'
-        9: 3,  # '×'
-        8: 3,  # 'ב'
-        20: 3,  # '×’'
-        16: 3,  # 'ד'
-        3: 3,  # '×”'
-        2: 3,  # 'ו'
-        24: 3,  # '×–'
-        14: 3,  # '×—'
-        22: 3,  # 'ט'
-        1: 3,  # '×™'
-        25: 3,  # 'ך'
-        15: 3,  # '×›'
-        4: 3,  # 'ל'
-        11: 3,  # '×'
-        6: 3,  # 'מ'
-        23: 2,  # 'ן'
-        12: 3,  # '× '
-        19: 3,  # 'ס'
-        13: 3,  # '×¢'
-        26: 2,  # '×£'
-        18: 3,  # 'פ'
-        27: 2,  # '×¥'
-        21: 3,  # 'צ'
-        17: 3,  # '×§'
-        7: 3,  # 'ר'
-        10: 3,  # 'ש'
-        5: 3,  # 'ת'
-        32: 1,  # '–'
-        52: 0,  # '’'
-        47: 0,  # '“'
-        46: 1,  # 'â€'
-        58: 0,  # '†'
-        40: 1,  # '…'
-    },
-    11: {  # '×'
-        50: 0,  # 'a'
-        60: 0,  # 'c'
-        61: 0,  # 'd'
-        42: 0,  # 'e'
-        53: 0,  # 'i'
-        56: 0,  # 'l'
-        54: 0,  # 'n'
-        49: 0,  # 'o'
-        51: 0,  # 'r'
-        43: 0,  # 's'
-        44: 0,  # 't'
-        63: 0,  # 'u'
-        34: 1,  # '\xa0'
-        55: 0,  # '´'
-        48: 0,  # '¼'
-        39: 0,  # '½'
-        57: 0,  # '¾'
-        30: 0,  # 'Ö°'
-        59: 0,  # 'Ö±'
-        41: 0,  # 'Ö²'
-        33: 0,  # 'Ö´'
-        37: 0,  # 'Öµ'
-        36: 0,  # 'Ö¶'
-        31: 0,  # 'Ö·'
-        29: 0,  # 'Ö¸'
-        35: 0,  # 'Ö¹'
-        62: 0,  # 'Ö»'
-        28: 0,  # 'Ö¼'
-        38: 0,  # '×'
-        45: 0,  # 'ׂ'
-        9: 1,  # '×'
-        8: 1,  # 'ב'
-        20: 1,  # '×’'
-        16: 0,  # 'ד'
-        3: 1,  # '×”'
-        2: 1,  # 'ו'
-        24: 1,  # '×–'
-        14: 1,  # '×—'
-        22: 0,  # 'ט'
-        1: 1,  # '×™'
-        25: 0,  # 'ך'
-        15: 1,  # '×›'
-        4: 1,  # 'ל'
-        11: 1,  # '×'
-        6: 1,  # 'מ'
-        23: 0,  # 'ן'
-        12: 1,  # '× '
-        19: 0,  # 'ס'
-        13: 1,  # '×¢'
-        26: 0,  # '×£'
-        18: 1,  # 'פ'
-        27: 1,  # '×¥'
-        21: 1,  # 'צ'
-        17: 1,  # '×§'
-        7: 1,  # 'ר'
-        10: 1,  # 'ש'
-        5: 1,  # 'ת'
-        32: 0,  # '–'
-        52: 0,  # '’'
-        47: 0,  # '“'
-        46: 1,  # 'â€'
-        58: 0,  # '†'
-        40: 2,  # '…'
-    },
-    6: {  # 'מ'
-        50: 0,  # 'a'
-        60: 0,  # 'c'
-        61: 0,  # 'd'
-        42: 0,  # 'e'
-        53: 0,  # 'i'
-        56: 0,  # 'l'
-        54: 0,  # 'n'
-        49: 0,  # 'o'
-        51: 0,  # 'r'
-        43: 0,  # 's'
-        44: 0,  # 't'
-        63: 0,  # 'u'
-        34: 0,  # '\xa0'
-        55: 1,  # '´'
-        48: 0,  # '¼'
-        39: 0,  # '½'
-        57: 0,  # '¾'
-        30: 2,  # 'Ö°'
-        59: 0,  # 'Ö±'
-        41: 0,  # 'Ö²'
-        33: 2,  # 'Ö´'
-        37: 2,  # 'Öµ'
-        36: 2,  # 'Ö¶'
-        31: 2,  # 'Ö·'
-        29: 2,  # 'Ö¸'
-        35: 2,  # 'Ö¹'
-        62: 1,  # 'Ö»'
-        28: 2,  # 'Ö¼'
-        38: 0,  # '×'
-        45: 0,  # 'ׂ'
-        9: 3,  # '×'
-        8: 3,  # 'ב'
-        20: 3,  # '×’'
-        16: 3,  # 'ד'
-        3: 3,  # '×”'
-        2: 3,  # 'ו'
-        24: 3,  # '×–'
-        14: 3,  # '×—'
-        22: 3,  # 'ט'
-        1: 3,  # '×™'
-        25: 2,  # 'ך'
-        15: 3,  # '×›'
-        4: 3,  # 'ל'
-        11: 3,  # '×'
-        6: 3,  # 'מ'
-        23: 3,  # 'ן'
-        12: 3,  # '× '
-        19: 3,  # 'ס'
-        13: 3,  # '×¢'
-        26: 0,  # '×£'
-        18: 3,  # 'פ'
-        27: 2,  # '×¥'
-        21: 3,  # 'צ'
-        17: 3,  # '×§'
-        7: 3,  # 'ר'
-        10: 3,  # 'ש'
-        5: 3,  # 'ת'
-        32: 0,  # '–'
-        52: 0,  # '’'
-        47: 0,  # '“'
-        46: 0,  # 'â€'
-        58: 0,  # '†'
-        40: 1,  # '…'
-    },
-    23: {  # 'ן'
-        50: 0,  # 'a'
-        60: 0,  # 'c'
-        61: 0,  # 'd'
-        42: 0,  # 'e'
-        53: 0,  # 'i'
-        56: 0,  # 'l'
-        54: 0,  # 'n'
-        49: 0,  # 'o'
-        51: 0,  # 'r'
-        43: 0,  # 's'
-        44: 0,  # 't'
-        63: 0,  # 'u'
-        34: 1,  # '\xa0'
-        55: 0,  # '´'
-        48: 1,  # '¼'
-        39: 0,  # '½'
-        57: 0,  # '¾'
-        30: 0,  # 'Ö°'
-        59: 0,  # 'Ö±'
-        41: 0,  # 'Ö²'
-        33: 0,  # 'Ö´'
-        37: 0,  # 'Öµ'
-        36: 0,  # 'Ö¶'
-        31: 0,  # 'Ö·'
-        29: 0,  # 'Ö¸'
-        35: 0,  # 'Ö¹'
-        62: 0,  # 'Ö»'
-        28: 0,  # 'Ö¼'
-        38: 0,  # '×'
-        45: 0,  # 'ׂ'
-        9: 1,  # '×'
-        8: 1,  # 'ב'
-        20: 1,  # '×’'
-        16: 1,  # 'ד'
-        3: 1,  # '×”'
-        2: 1,  # 'ו'
-        24: 0,  # '×–'
-        14: 1,  # '×—'
-        22: 1,  # 'ט'
-        1: 1,  # '×™'
-        25: 0,  # 'ך'
-        15: 1,  # '×›'
-        4: 1,  # 'ל'
-        11: 1,  # '×'
-        6: 1,  # 'מ'
-        23: 0,  # 'ן'
-        12: 1,  # '× '
-        19: 1,  # 'ס'
-        13: 1,  # '×¢'
-        26: 1,  # '×£'
-        18: 1,  # 'פ'
-        27: 0,  # '×¥'
-        21: 0,  # 'צ'
-        17: 1,  # '×§'
-        7: 1,  # 'ר'
-        10: 1,  # 'ש'
-        5: 1,  # 'ת'
-        32: 1,  # '–'
-        52: 0,  # '’'
-        47: 0,  # '“'
-        46: 1,  # 'â€'
-        58: 0,  # '†'
-        40: 2,  # '…'
-    },
-    12: {  # '× '
-        50: 0,  # 'a'
-        60: 0,  # 'c'
-        61: 0,  # 'd'
-        42: 0,  # 'e'
-        53: 0,  # 'i'
-        56: 0,  # 'l'
-        54: 0,  # 'n'
-        49: 0,  # 'o'
-        51: 0,  # 'r'
-        43: 0,  # 's'
-        44: 0,  # 't'
-        63: 0,  # 'u'
-        34: 0,  # '\xa0'
-        55: 0,  # '´'
-        48: 0,  # '¼'
-        39: 0,  # '½'
-        57: 0,  # '¾'
-        30: 2,  # 'Ö°'
-        59: 0,  # 'Ö±'
-        41: 0,  # 'Ö²'
-        33: 2,  # 'Ö´'
-        37: 2,  # 'Öµ'
-        36: 2,  # 'Ö¶'
-        31: 2,  # 'Ö·'
-        29: 2,  # 'Ö¸'
-        35: 1,  # 'Ö¹'
-        62: 1,  # 'Ö»'
-        28: 2,  # 'Ö¼'
-        38: 0,  # '×'
-        45: 0,  # 'ׂ'
-        9: 3,  # '×'
-        8: 3,  # 'ב'
-        20: 3,  # '×’'
-        16: 3,  # 'ד'
-        3: 3,  # '×”'
-        2: 3,  # 'ו'
-        24: 3,  # '×–'
-        14: 3,  # '×—'
-        22: 3,  # 'ט'
-        1: 3,  # '×™'
-        25: 2,  # 'ך'
-        15: 3,  # '×›'
-        4: 3,  # 'ל'
-        11: 3,  # '×'
-        6: 3,  # 'מ'
-        23: 3,  # 'ן'
-        12: 3,  # '× '
-        19: 3,  # 'ס'
-        13: 3,  # '×¢'
-        26: 2,  # '×£'
-        18: 3,  # 'פ'
-        27: 2,  # '×¥'
-        21: 3,  # 'צ'
-        17: 3,  # '×§'
-        7: 3,  # 'ר'
-        10: 3,  # 'ש'
-        5: 3,  # 'ת'
-        32: 0,  # '–'
-        52: 0,  # '’'
-        47: 0,  # '“'
-        46: 0,  # 'â€'
-        58: 0,  # '†'
-        40: 0,  # '…'
-    },
-    19: {  # 'ס'
-        50: 0,  # 'a'
-        60: 0,  # 'c'
-        61: 0,  # 'd'
-        42: 0,  # 'e'
-        53: 0,  # 'i'
-        56: 0,  # 'l'
-        54: 0,  # 'n'
-        49: 0,  # 'o'
-        51: 0,  # 'r'
-        43: 0,  # 's'
-        44: 0,  # 't'
-        63: 0,  # 'u'
-        34: 1,  # '\xa0'
-        55: 1,  # '´'
-        48: 0,  # '¼'
-        39: 0,  # '½'
-        57: 0,  # '¾'
-        30: 2,  # 'Ö°'
-        59: 0,  # 'Ö±'
-        41: 0,  # 'Ö²'
-        33: 2,  # 'Ö´'
-        37: 1,  # 'Öµ'
-        36: 2,  # 'Ö¶'
-        31: 2,  # 'Ö·'
-        29: 1,  # 'Ö¸'
-        35: 1,  # 'Ö¹'
-        62: 2,  # 'Ö»'
-        28: 2,  # 'Ö¼'
-        38: 0,  # '×'
-        45: 0,  # 'ׂ'
-        9: 2,  # '×'
-        8: 3,  # 'ב'
-        20: 3,  # '×’'
-        16: 3,  # 'ד'
-        3: 3,  # '×”'
-        2: 3,  # 'ו'
-        24: 1,  # '×–'
-        14: 3,  # '×—'
-        22: 3,  # 'ט'
-        1: 3,  # '×™'
-        25: 2,  # 'ך'
-        15: 3,  # '×›'
-        4: 3,  # 'ל'
-        11: 2,  # '×'
-        6: 3,  # 'מ'
-        23: 2,  # 'ן'
-        12: 3,  # '× '
-        19: 2,  # 'ס'
-        13: 3,  # '×¢'
-        26: 3,  # '×£'
-        18: 3,  # 'פ'
-        27: 0,  # '×¥'
-        21: 2,  # 'צ'
-        17: 3,  # '×§'
-        7: 3,  # 'ר'
-        10: 1,  # 'ש'
-        5: 3,  # 'ת'
-        32: 0,  # '–'
-        52: 0,  # '’'
-        47: 0,  # '“'
-        46: 1,  # 'â€'
-        58: 0,  # '†'
-        40: 1,  # '…'
-    },
-    13: {  # '×¢'
-        50: 0,  # 'a'
-        60: 0,  # 'c'
-        61: 0,  # 'd'
-        42: 0,  # 'e'
-        53: 0,  # 'i'
-        56: 0,  # 'l'
-        54: 0,  # 'n'
-        49: 0,  # 'o'
-        51: 0,  # 'r'
-        43: 0,  # 's'
-        44: 0,  # 't'
-        63: 0,  # 'u'
-        34: 0,  # '\xa0'
-        55: 0,  # '´'
-        48: 1,  # '¼'
-        39: 0,  # '½'
-        57: 0,  # '¾'
-        30: 1,  # 'Ö°'
-        59: 1,  # 'Ö±'
-        41: 2,  # 'Ö²'
-        33: 2,  # 'Ö´'
-        37: 2,  # 'Öµ'
-        36: 2,  # 'Ö¶'
-        31: 2,  # 'Ö·'
-        29: 2,  # 'Ö¸'
-        35: 2,  # 'Ö¹'
-        62: 1,  # 'Ö»'
-        28: 0,  # 'Ö¼'
-        38: 0,  # '×'
-        45: 0,  # 'ׂ'
-        9: 2,  # '×'
-        8: 3,  # 'ב'
-        20: 3,  # '×’'
-        16: 3,  # 'ד'
-        3: 3,  # '×”'
-        2: 3,  # 'ו'
-        24: 3,  # '×–'
-        14: 1,  # '×—'
-        22: 3,  # 'ט'
-        1: 3,  # '×™'
-        25: 2,  # 'ך'
-        15: 2,  # '×›'
-        4: 3,  # 'ל'
-        11: 3,  # '×'
-        6: 3,  # 'מ'
-        23: 2,  # 'ן'
-        12: 3,  # '× '
-        19: 3,  # 'ס'
-        13: 2,  # '×¢'
-        26: 1,  # '×£'
-        18: 2,  # 'פ'
-        27: 2,  # '×¥'
-        21: 3,  # 'צ'
-        17: 3,  # '×§'
-        7: 3,  # 'ר'
-        10: 3,  # 'ש'
-        5: 3,  # 'ת'
-        32: 0,  # '–'
-        52: 0,  # '’'
-        47: 0,  # '“'
-        46: 1,  # 'â€'
-        58: 0,  # '†'
-        40: 1,  # '…'
-    },
-    26: {  # '×£'
-        50: 0,  # 'a'
-        60: 0,  # 'c'
-        61: 0,  # 'd'
-        42: 0,  # 'e'
-        53: 0,  # 'i'
-        56: 0,  # 'l'
-        54: 0,  # 'n'
-        49: 0,  # 'o'
-        51: 0,  # 'r'
-        43: 0,  # 's'
-        44: 0,  # 't'
-        63: 0,  # 'u'
-        34: 0,  # '\xa0'
-        55: 0,  # '´'
-        48: 0,  # '¼'
-        39: 0,  # '½'
-        57: 0,  # '¾'
-        30: 0,  # 'Ö°'
-        59: 0,  # 'Ö±'
-        41: 0,  # 'Ö²'
-        33: 0,  # 'Ö´'
-        37: 0,  # 'Öµ'
-        36: 0,  # 'Ö¶'
-        31: 0,  # 'Ö·'
-        29: 0,  # 'Ö¸'
-        35: 0,  # 'Ö¹'
-        62: 0,  # 'Ö»'
-        28: 0,  # 'Ö¼'
-        38: 0,  # '×'
-        45: 0,  # 'ׂ'
-        9: 1,  # '×'
-        8: 0,  # 'ב'
-        20: 0,  # '×’'
-        16: 0,  # 'ד'
-        3: 0,  # '×”'
-        2: 1,  # 'ו'
-        24: 0,  # '×–'
-        14: 1,  # '×—'
-        22: 0,  # 'ט'
-        1: 0,  # '×™'
-        25: 0,  # 'ך'
-        15: 1,  # '×›'
-        4: 1,  # 'ל'
-        11: 0,  # '×'
-        6: 1,  # 'מ'
-        23: 0,  # 'ן'
-        12: 0,  # '× '
-        19: 1,  # 'ס'
-        13: 0,  # '×¢'
-        26: 1,  # '×£'
-        18: 1,  # 'פ'
-        27: 0,  # '×¥'
-        21: 0,  # 'צ'
-        17: 1,  # '×§'
-        7: 1,  # 'ר'
-        10: 1,  # 'ש'
-        5: 0,  # 'ת'
-        32: 0,  # '–'
-        52: 0,  # '’'
-        47: 0,  # '“'
-        46: 0,  # 'â€'
-        58: 0,  # '†'
-        40: 1,  # '…'
-    },
-    18: {  # 'פ'
-        50: 0,  # 'a'
-        60: 0,  # 'c'
-        61: 0,  # 'd'
-        42: 0,  # 'e'
-        53: 0,  # 'i'
-        56: 0,  # 'l'
-        54: 0,  # 'n'
-        49: 0,  # 'o'
-        51: 0,  # 'r'
-        43: 0,  # 's'
-        44: 0,  # 't'
-        63: 0,  # 'u'
-        34: 0,  # '\xa0'
-        55: 1,  # '´'
-        48: 0,  # '¼'
-        39: 0,  # '½'
-        57: 0,  # '¾'
-        30: 2,  # 'Ö°'
-        59: 0,  # 'Ö±'
-        41: 0,  # 'Ö²'
-        33: 2,  # 'Ö´'
-        37: 1,  # 'Öµ'
-        36: 2,  # 'Ö¶'
-        31: 1,  # 'Ö·'
-        29: 2,  # 'Ö¸'
-        35: 1,  # 'Ö¹'
-        62: 1,  # 'Ö»'
-        28: 2,  # 'Ö¼'
-        38: 0,  # '×'
-        45: 0,  # 'ׂ'
-        9: 3,  # '×'
-        8: 2,  # 'ב'
-        20: 3,  # '×’'
-        16: 2,  # 'ד'
-        3: 3,  # '×”'
-        2: 3,  # 'ו'
-        24: 2,  # '×–'
-        14: 3,  # '×—'
-        22: 3,  # 'ט'
-        1: 3,  # '×™'
-        25: 2,  # 'ך'
-        15: 3,  # '×›'
-        4: 3,  # 'ל'
-        11: 2,  # '×'
-        6: 2,  # 'מ'
-        23: 3,  # 'ן'
-        12: 3,  # '× '
-        19: 3,  # 'ס'
-        13: 3,  # '×¢'
-        26: 2,  # '×£'
-        18: 2,  # 'פ'
-        27: 2,  # '×¥'
-        21: 3,  # 'צ'
-        17: 3,  # '×§'
-        7: 3,  # 'ר'
-        10: 3,  # 'ש'
-        5: 3,  # 'ת'
-        32: 0,  # '–'
-        52: 0,  # '’'
-        47: 0,  # '“'
-        46: 1,  # 'â€'
-        58: 0,  # '†'
-        40: 0,  # '…'
-    },
-    27: {  # '×¥'
-        50: 0,  # 'a'
-        60: 0,  # 'c'
-        61: 0,  # 'd'
-        42: 0,  # 'e'
-        53: 0,  # 'i'
-        56: 0,  # 'l'
-        54: 0,  # 'n'
-        49: 0,  # 'o'
-        51: 0,  # 'r'
-        43: 0,  # 's'
-        44: 0,  # 't'
-        63: 0,  # 'u'
-        34: 0,  # '\xa0'
-        55: 1,  # '´'
-        48: 0,  # '¼'
-        39: 0,  # '½'
-        57: 0,  # '¾'
-        30: 0,  # 'Ö°'
-        59: 0,  # 'Ö±'
-        41: 0,  # 'Ö²'
-        33: 0,  # 'Ö´'
-        37: 0,  # 'Öµ'
-        36: 0,  # 'Ö¶'
-        31: 0,  # 'Ö·'
-        29: 0,  # 'Ö¸'
-        35: 0,  # 'Ö¹'
-        62: 0,  # 'Ö»'
-        28: 0,  # 'Ö¼'
-        38: 0,  # '×'
-        45: 0,  # 'ׂ'
-        9: 1,  # '×'
-        8: 0,  # 'ב'
-        20: 0,  # '×’'
-        16: 0,  # 'ד'
-        3: 0,  # '×”'
-        2: 0,  # 'ו'
-        24: 0,  # '×–'
-        14: 0,  # '×—'
-        22: 0,  # 'ט'
-        1: 0,  # '×™'
-        25: 0,  # 'ך'
-        15: 0,  # '×›'
-        4: 1,  # 'ל'
-        11: 0,  # '×'
-        6: 0,  # 'מ'
-        23: 0,  # 'ן'
-        12: 0,  # '× '
-        19: 1,  # 'ס'
-        13: 0,  # '×¢'
-        26: 0,  # '×£'
-        18: 0,  # 'פ'
-        27: 0,  # '×¥'
-        21: 0,  # 'צ'
-        17: 0,  # '×§'
-        7: 1,  # 'ר'
-        10: 0,  # 'ש'
-        5: 1,  # 'ת'
-        32: 0,  # '–'
-        52: 0,  # '’'
-        47: 0,  # '“'
-        46: 0,  # 'â€'
-        58: 0,  # '†'
-        40: 1,  # '…'
-    },
-    21: {  # 'צ'
-        50: 0,  # 'a'
-        60: 0,  # 'c'
-        61: 0,  # 'd'
-        42: 0,  # 'e'
-        53: 0,  # 'i'
-        56: 0,  # 'l'
-        54: 0,  # 'n'
-        49: 0,  # 'o'
-        51: 0,  # 'r'
-        43: 0,  # 's'
-        44: 0,  # 't'
-        63: 0,  # 'u'
-        34: 0,  # '\xa0'
-        55: 1,  # '´'
-        48: 0,  # '¼'
-        39: 0,  # '½'
-        57: 0,  # '¾'
-        30: 2,  # 'Ö°'
-        59: 0,  # 'Ö±'
-        41: 0,  # 'Ö²'
-        33: 2,  # 'Ö´'
-        37: 2,  # 'Öµ'
-        36: 1,  # 'Ö¶'
-        31: 2,  # 'Ö·'
-        29: 2,  # 'Ö¸'
-        35: 1,  # 'Ö¹'
-        62: 1,  # 'Ö»'
-        28: 2,  # 'Ö¼'
-        38: 0,  # '×'
-        45: 0,  # 'ׂ'
-        9: 3,  # '×'
-        8: 3,  # 'ב'
-        20: 2,  # '×’'
-        16: 3,  # 'ד'
-        3: 3,  # '×”'
-        2: 3,  # 'ו'
-        24: 1,  # '×–'
-        14: 3,  # '×—'
-        22: 2,  # 'ט'
-        1: 3,  # '×™'
-        25: 1,  # 'ך'
-        15: 1,  # '×›'
-        4: 3,  # 'ל'
-        11: 2,  # '×'
-        6: 3,  # 'מ'
-        23: 2,  # 'ן'
-        12: 3,  # '× '
-        19: 1,  # 'ס'
-        13: 3,  # '×¢'
-        26: 2,  # '×£'
-        18: 3,  # 'פ'
-        27: 2,  # '×¥'
-        21: 2,  # 'צ'
-        17: 3,  # '×§'
-        7: 3,  # 'ר'
-        10: 0,  # 'ש'
-        5: 3,  # 'ת'
-        32: 0,  # '–'
-        52: 0,  # '’'
-        47: 0,  # '“'
-        46: 0,  # 'â€'
-        58: 0,  # '†'
-        40: 0,  # '…'
-    },
-    17: {  # '×§'
-        50: 0,  # 'a'
-        60: 0,  # 'c'
-        61: 0,  # 'd'
-        42: 0,  # 'e'
-        53: 0,  # 'i'
-        56: 0,  # 'l'
-        54: 0,  # 'n'
-        49: 0,  # 'o'
-        51: 0,  # 'r'
-        43: 0,  # 's'
-        44: 0,  # 't'
-        63: 0,  # 'u'
-        34: 1,  # '\xa0'
-        55: 1,  # '´'
-        48: 0,  # '¼'
-        39: 0,  # '½'
-        57: 0,  # '¾'
-        30: 2,  # 'Ö°'
-        59: 0,  # 'Ö±'
-        41: 0,  # 'Ö²'
-        33: 2,  # 'Ö´'
-        37: 2,  # 'Öµ'
-        36: 1,  # 'Ö¶'
-        31: 2,  # 'Ö·'
-        29: 2,  # 'Ö¸'
-        35: 2,  # 'Ö¹'
-        62: 1,  # 'Ö»'
-        28: 2,  # 'Ö¼'
-        38: 0,  # '×'
-        45: 0,  # 'ׂ'
-        9: 3,  # '×'
-        8: 3,  # 'ב'
-        20: 2,  # '×’'
-        16: 3,  # 'ד'
-        3: 3,  # '×”'
-        2: 3,  # 'ו'
-        24: 2,  # '×–'
-        14: 3,  # '×—'
-        22: 3,  # 'ט'
-        1: 3,  # '×™'
-        25: 1,  # 'ך'
-        15: 1,  # '×›'
-        4: 3,  # 'ל'
-        11: 2,  # '×'
-        6: 3,  # 'מ'
-        23: 2,  # 'ן'
-        12: 3,  # '× '
-        19: 3,  # 'ס'
-        13: 3,  # '×¢'
-        26: 2,  # '×£'
-        18: 3,  # 'פ'
-        27: 2,  # '×¥'
-        21: 3,  # 'צ'
-        17: 2,  # '×§'
-        7: 3,  # 'ר'
-        10: 3,  # 'ש'
-        5: 3,  # 'ת'
-        32: 0,  # '–'
-        52: 1,  # '’'
-        47: 0,  # '“'
-        46: 1,  # 'â€'
-        58: 0,  # '†'
-        40: 1,  # '…'
-    },
-    7: {  # 'ר'
-        50: 0,  # 'a'
-        60: 0,  # 'c'
-        61: 0,  # 'd'
-        42: 0,  # 'e'
-        53: 0,  # 'i'
-        56: 0,  # 'l'
-        54: 0,  # 'n'
-        49: 0,  # 'o'
-        51: 0,  # 'r'
-        43: 0,  # 's'
-        44: 0,  # 't'
-        63: 0,  # 'u'
-        34: 1,  # '\xa0'
-        55: 2,  # '´'
-        48: 1,  # '¼'
-        39: 0,  # '½'
-        57: 0,  # '¾'
-        30: 2,  # 'Ö°'
-        59: 0,  # 'Ö±'
-        41: 1,  # 'Ö²'
-        33: 2,  # 'Ö´'
-        37: 2,  # 'Öµ'
-        36: 2,  # 'Ö¶'
-        31: 2,  # 'Ö·'
-        29: 2,  # 'Ö¸'
-        35: 2,  # 'Ö¹'
-        62: 1,  # 'Ö»'
-        28: 0,  # 'Ö¼'
-        38: 0,  # '×'
-        45: 0,  # 'ׂ'
-        9: 3,  # '×'
-        8: 3,  # 'ב'
-        20: 3,  # '×’'
-        16: 3,  # 'ד'
-        3: 3,  # '×”'
-        2: 3,  # 'ו'
-        24: 3,  # '×–'
-        14: 3,  # '×—'
-        22: 3,  # 'ט'
-        1: 3,  # '×™'
-        25: 3,  # 'ך'
-        15: 3,  # '×›'
-        4: 3,  # 'ל'
-        11: 3,  # '×'
-        6: 3,  # 'מ'
-        23: 3,  # 'ן'
-        12: 3,  # '× '
-        19: 3,  # 'ס'
-        13: 3,  # '×¢'
-        26: 2,  # '×£'
-        18: 3,  # 'פ'
-        27: 3,  # '×¥'
-        21: 3,  # 'צ'
-        17: 3,  # '×§'
-        7: 3,  # 'ר'
-        10: 3,  # 'ש'
-        5: 3,  # 'ת'
-        32: 0,  # '–'
-        52: 0,  # '’'
-        47: 0,  # '“'
-        46: 1,  # 'â€'
-        58: 0,  # '†'
-        40: 2,  # '…'
-    },
-    10: {  # 'ש'
-        50: 0,  # 'a'
-        60: 0,  # 'c'
-        61: 0,  # 'd'
-        42: 0,  # 'e'
-        53: 0,  # 'i'
-        56: 0,  # 'l'
-        54: 0,  # 'n'
-        49: 0,  # 'o'
-        51: 0,  # 'r'
-        43: 0,  # 's'
-        44: 0,  # 't'
-        63: 0,  # 'u'
-        34: 1,  # '\xa0'
-        55: 0,  # '´'
-        48: 0,  # '¼'
-        39: 0,  # '½'
-        57: 0,  # '¾'
-        30: 1,  # 'Ö°'
-        59: 0,  # 'Ö±'
-        41: 0,  # 'Ö²'
-        33: 1,  # 'Ö´'
-        37: 1,  # 'Öµ'
-        36: 1,  # 'Ö¶'
-        31: 1,  # 'Ö·'
-        29: 1,  # 'Ö¸'
-        35: 1,  # 'Ö¹'
-        62: 1,  # 'Ö»'
-        28: 2,  # 'Ö¼'
-        38: 3,  # '×'
-        45: 2,  # 'ׂ'
-        9: 3,  # '×'
-        8: 3,  # 'ב'
-        20: 3,  # '×’'
-        16: 3,  # 'ד'
-        3: 3,  # '×”'
-        2: 3,  # 'ו'
-        24: 2,  # '×–'
-        14: 3,  # '×—'
-        22: 3,  # 'ט'
-        1: 3,  # '×™'
-        25: 3,  # 'ך'
-        15: 3,  # '×›'
-        4: 3,  # 'ל'
-        11: 3,  # '×'
-        6: 3,  # 'מ'
-        23: 2,  # 'ן'
-        12: 3,  # '× '
-        19: 2,  # 'ס'
-        13: 3,  # '×¢'
-        26: 2,  # '×£'
-        18: 3,  # 'פ'
-        27: 1,  # '×¥'
-        21: 2,  # 'צ'
-        17: 3,  # '×§'
-        7: 3,  # 'ר'
-        10: 3,  # 'ש'
-        5: 3,  # 'ת'
-        32: 0,  # '–'
-        52: 0,  # '’'
-        47: 0,  # '“'
-        46: 1,  # 'â€'
-        58: 0,  # '†'
-        40: 1,  # '…'
-    },
-    5: {  # 'ת'
-        50: 0,  # 'a'
-        60: 0,  # 'c'
-        61: 0,  # 'd'
-        42: 0,  # 'e'
-        53: 0,  # 'i'
-        56: 0,  # 'l'
-        54: 0,  # 'n'
-        49: 0,  # 'o'
-        51: 0,  # 'r'
-        43: 0,  # 's'
-        44: 0,  # 't'
-        63: 0,  # 'u'
-        34: 1,  # '\xa0'
-        55: 0,  # '´'
-        48: 1,  # '¼'
-        39: 1,  # '½'
-        57: 0,  # '¾'
-        30: 2,  # 'Ö°'
-        59: 0,  # 'Ö±'
-        41: 0,  # 'Ö²'
-        33: 2,  # 'Ö´'
-        37: 2,  # 'Öµ'
-        36: 2,  # 'Ö¶'
-        31: 2,  # 'Ö·'
-        29: 2,  # 'Ö¸'
-        35: 1,  # 'Ö¹'
-        62: 1,  # 'Ö»'
-        28: 2,  # 'Ö¼'
-        38: 0,  # '×'
-        45: 0,  # 'ׂ'
-        9: 3,  # '×'
-        8: 3,  # 'ב'
-        20: 3,  # '×’'
-        16: 2,  # 'ד'
-        3: 3,  # '×”'
-        2: 3,  # 'ו'
-        24: 2,  # '×–'
-        14: 3,  # '×—'
-        22: 2,  # 'ט'
-        1: 3,  # '×™'
-        25: 2,  # 'ך'
-        15: 3,  # '×›'
-        4: 3,  # 'ל'
-        11: 3,  # '×'
-        6: 3,  # 'מ'
-        23: 3,  # 'ן'
-        12: 3,  # '× '
-        19: 2,  # 'ס'
-        13: 3,  # '×¢'
-        26: 2,  # '×£'
-        18: 3,  # 'פ'
-        27: 1,  # '×¥'
-        21: 2,  # 'צ'
-        17: 3,  # '×§'
-        7: 3,  # 'ר'
-        10: 3,  # 'ש'
-        5: 3,  # 'ת'
-        32: 1,  # '–'
-        52: 1,  # '’'
-        47: 0,  # '“'
-        46: 0,  # 'â€'
-        58: 0,  # '†'
-        40: 2,  # '…'
-    },
-    32: {  # '–'
-        50: 0,  # 'a'
-        60: 0,  # 'c'
-        61: 0,  # 'd'
-        42: 0,  # 'e'
-        53: 0,  # 'i'
-        56: 0,  # 'l'
-        54: 1,  # 'n'
-        49: 0,  # 'o'
-        51: 0,  # 'r'
-        43: 0,  # 's'
-        44: 0,  # 't'
-        63: 0,  # 'u'
-        34: 0,  # '\xa0'
-        55: 0,  # '´'
-        48: 0,  # '¼'
-        39: 0,  # '½'
-        57: 0,  # '¾'
-        30: 0,  # 'Ö°'
-        59: 0,  # 'Ö±'
-        41: 0,  # 'Ö²'
-        33: 0,  # 'Ö´'
-        37: 0,  # 'Öµ'
-        36: 0,  # 'Ö¶'
-        31: 0,  # 'Ö·'
-        29: 0,  # 'Ö¸'
-        35: 0,  # 'Ö¹'
-        62: 0,  # 'Ö»'
-        28: 0,  # 'Ö¼'
-        38: 0,  # '×'
-        45: 0,  # 'ׂ'
-        9: 1,  # '×'
-        8: 1,  # 'ב'
-        20: 1,  # '×’'
-        16: 1,  # 'ד'
-        3: 1,  # '×”'
-        2: 1,  # 'ו'
-        24: 0,  # '×–'
-        14: 1,  # '×—'
-        22: 0,  # 'ט'
-        1: 1,  # '×™'
-        25: 0,  # 'ך'
-        15: 1,  # '×›'
-        4: 1,  # 'ל'
-        11: 0,  # '×'
-        6: 1,  # 'מ'
-        23: 0,  # 'ן'
-        12: 0,  # '× '
-        19: 1,  # 'ס'
-        13: 1,  # '×¢'
-        26: 0,  # '×£'
-        18: 1,  # 'פ'
-        27: 0,  # '×¥'
-        21: 1,  # 'צ'
-        17: 0,  # '×§'
-        7: 1,  # 'ר'
-        10: 1,  # 'ש'
-        5: 1,  # 'ת'
-        32: 0,  # '–'
-        52: 0,  # '’'
-        47: 0,  # '“'
-        46: 0,  # 'â€'
-        58: 0,  # '†'
-        40: 0,  # '…'
-    },
-    52: {  # '’'
-        50: 1,  # 'a'
-        60: 0,  # 'c'
-        61: 1,  # 'd'
-        42: 1,  # 'e'
-        53: 1,  # 'i'
-        56: 1,  # 'l'
-        54: 0,  # 'n'
-        49: 0,  # 'o'
-        51: 1,  # 'r'
-        43: 2,  # 's'
-        44: 2,  # 't'
-        63: 1,  # 'u'
-        34: 0,  # '\xa0'
-        55: 0,  # '´'
-        48: 0,  # '¼'
-        39: 0,  # '½'
-        57: 0,  # '¾'
-        30: 0,  # 'Ö°'
-        59: 0,  # 'Ö±'
-        41: 0,  # 'Ö²'
-        33: 0,  # 'Ö´'
-        37: 0,  # 'Öµ'
-        36: 0,  # 'Ö¶'
-        31: 0,  # 'Ö·'
-        29: 0,  # 'Ö¸'
-        35: 0,  # 'Ö¹'
-        62: 0,  # 'Ö»'
-        28: 0,  # 'Ö¼'
-        38: 0,  # '×'
-        45: 0,  # 'ׂ'
-        9: 0,  # '×'
-        8: 0,  # 'ב'
-        20: 0,  # '×’'
-        16: 0,  # 'ד'
-        3: 0,  # '×”'
-        2: 1,  # 'ו'
-        24: 0,  # '×–'
-        14: 0,  # '×—'
-        22: 0,  # 'ט'
-        1: 0,  # '×™'
-        25: 0,  # 'ך'
-        15: 0,  # '×›'
-        4: 0,  # 'ל'
-        11: 0,  # '×'
-        6: 1,  # 'מ'
-        23: 0,  # 'ן'
-        12: 0,  # '× '
-        19: 0,  # 'ס'
-        13: 0,  # '×¢'
-        26: 0,  # '×£'
-        18: 0,  # 'פ'
-        27: 0,  # '×¥'
-        21: 0,  # 'צ'
-        17: 0,  # '×§'
-        7: 0,  # 'ר'
-        10: 0,  # 'ש'
-        5: 1,  # 'ת'
-        32: 0,  # '–'
-        52: 0,  # '’'
-        47: 0,  # '“'
-        46: 0,  # 'â€'
-        58: 0,  # '†'
-        40: 0,  # '…'
-    },
-    47: {  # '“'
-        50: 1,  # 'a'
-        60: 1,  # 'c'
-        61: 1,  # 'd'
-        42: 1,  # 'e'
-        53: 1,  # 'i'
-        56: 1,  # 'l'
-        54: 1,  # 'n'
-        49: 1,  # 'o'
-        51: 1,  # 'r'
-        43: 1,  # 's'
-        44: 1,  # 't'
-        63: 1,  # 'u'
-        34: 0,  # '\xa0'
-        55: 0,  # '´'
-        48: 0,  # '¼'
-        39: 0,  # '½'
-        57: 0,  # '¾'
-        30: 0,  # 'Ö°'
-        59: 0,  # 'Ö±'
-        41: 0,  # 'Ö²'
-        33: 0,  # 'Ö´'
-        37: 0,  # 'Öµ'
-        36: 0,  # 'Ö¶'
-        31: 0,  # 'Ö·'
-        29: 0,  # 'Ö¸'
-        35: 0,  # 'Ö¹'
-        62: 0,  # 'Ö»'
-        28: 0,  # 'Ö¼'
-        38: 0,  # '×'
-        45: 0,  # 'ׂ'
-        9: 2,  # '×'
-        8: 1,  # 'ב'
-        20: 1,  # '×’'
-        16: 1,  # 'ד'
-        3: 1,  # '×”'
-        2: 1,  # 'ו'
-        24: 1,  # '×–'
-        14: 1,  # '×—'
-        22: 1,  # 'ט'
-        1: 1,  # '×™'
-        25: 0,  # 'ך'
-        15: 1,  # '×›'
-        4: 1,  # 'ל'
-        11: 0,  # '×'
-        6: 1,  # 'מ'
-        23: 0,  # 'ן'
-        12: 1,  # '× '
-        19: 1,  # 'ס'
-        13: 1,  # '×¢'
-        26: 0,  # '×£'
-        18: 1,  # 'פ'
-        27: 0,  # '×¥'
-        21: 1,  # 'צ'
-        17: 1,  # '×§'
-        7: 1,  # 'ר'
-        10: 1,  # 'ש'
-        5: 1,  # 'ת'
-        32: 0,  # '–'
-        52: 0,  # '’'
-        47: 0,  # '“'
-        46: 0,  # 'â€'
-        58: 0,  # '†'
-        40: 0,  # '…'
-    },
-    46: {  # 'â€'
-        50: 0,  # 'a'
-        60: 0,  # 'c'
-        61: 0,  # 'd'
-        42: 0,  # 'e'
-        53: 0,  # 'i'
-        56: 0,  # 'l'
-        54: 0,  # 'n'
-        49: 0,  # 'o'
-        51: 0,  # 'r'
-        43: 0,  # 's'
-        44: 1,  # 't'
-        63: 0,  # 'u'
-        34: 0,  # '\xa0'
-        55: 0,  # '´'
-        48: 0,  # '¼'
-        39: 0,  # '½'
-        57: 0,  # '¾'
-        30: 0,  # 'Ö°'
-        59: 0,  # 'Ö±'
-        41: 0,  # 'Ö²'
-        33: 0,  # 'Ö´'
-        37: 0,  # 'Öµ'
-        36: 0,  # 'Ö¶'
-        31: 0,  # 'Ö·'
-        29: 0,  # 'Ö¸'
-        35: 0,  # 'Ö¹'
-        62: 0,  # 'Ö»'
-        28: 0,  # 'Ö¼'
-        38: 0,  # '×'
-        45: 0,  # 'ׂ'
-        9: 1,  # '×'
-        8: 1,  # 'ב'
-        20: 1,  # '×’'
-        16: 0,  # 'ד'
-        3: 0,  # '×”'
-        2: 0,  # 'ו'
-        24: 0,  # '×–'
-        14: 0,  # '×—'
-        22: 0,  # 'ט'
-        1: 1,  # '×™'
-        25: 0,  # 'ך'
-        15: 1,  # '×›'
-        4: 1,  # 'ל'
-        11: 0,  # '×'
-        6: 1,  # 'מ'
-        23: 0,  # 'ן'
-        12: 0,  # '× '
-        19: 0,  # 'ס'
-        13: 0,  # '×¢'
-        26: 0,  # '×£'
-        18: 0,  # 'פ'
-        27: 0,  # '×¥'
-        21: 1,  # 'צ'
-        17: 0,  # '×§'
-        7: 1,  # 'ר'
-        10: 0,  # 'ש'
-        5: 0,  # 'ת'
-        32: 0,  # '–'
-        52: 0,  # '’'
-        47: 0,  # '“'
-        46: 0,  # 'â€'
-        58: 0,  # '†'
-        40: 0,  # '…'
-    },
-    58: {  # '†'
-        50: 0,  # 'a'
-        60: 0,  # 'c'
-        61: 0,  # 'd'
-        42: 0,  # 'e'
-        53: 0,  # 'i'
-        56: 0,  # 'l'
-        54: 0,  # 'n'
-        49: 0,  # 'o'
-        51: 0,  # 'r'
-        43: 0,  # 's'
-        44: 0,  # 't'
-        63: 0,  # 'u'
-        34: 0,  # '\xa0'
-        55: 0,  # '´'
-        48: 0,  # '¼'
-        39: 0,  # '½'
-        57: 0,  # '¾'
-        30: 0,  # 'Ö°'
-        59: 0,  # 'Ö±'
-        41: 0,  # 'Ö²'
-        33: 0,  # 'Ö´'
-        37: 0,  # 'Öµ'
-        36: 0,  # 'Ö¶'
-        31: 0,  # 'Ö·'
-        29: 0,  # 'Ö¸'
-        35: 0,  # 'Ö¹'
-        62: 0,  # 'Ö»'
-        28: 0,  # 'Ö¼'
-        38: 0,  # '×'
-        45: 0,  # 'ׂ'
-        9: 0,  # '×'
-        8: 0,  # 'ב'
-        20: 0,  # '×’'
-        16: 0,  # 'ד'
-        3: 0,  # '×”'
-        2: 0,  # 'ו'
-        24: 0,  # '×–'
-        14: 0,  # '×—'
-        22: 0,  # 'ט'
-        1: 0,  # '×™'
-        25: 0,  # 'ך'
-        15: 0,  # '×›'
-        4: 0,  # 'ל'
-        11: 0,  # '×'
-        6: 0,  # 'מ'
-        23: 0,  # 'ן'
-        12: 0,  # '× '
-        19: 0,  # 'ס'
-        13: 0,  # '×¢'
-        26: 0,  # '×£'
-        18: 0,  # 'פ'
-        27: 0,  # '×¥'
-        21: 0,  # 'צ'
-        17: 0,  # '×§'
-        7: 0,  # 'ר'
-        10: 0,  # 'ש'
-        5: 0,  # 'ת'
-        32: 0,  # '–'
-        52: 0,  # '’'
-        47: 0,  # '“'
-        46: 0,  # 'â€'
-        58: 2,  # '†'
-        40: 0,  # '…'
-    },
-    40: {  # '…'
-        50: 1,  # 'a'
-        60: 1,  # 'c'
-        61: 1,  # 'd'
-        42: 1,  # 'e'
-        53: 1,  # 'i'
-        56: 0,  # 'l'
-        54: 1,  # 'n'
-        49: 0,  # 'o'
-        51: 1,  # 'r'
-        43: 1,  # 's'
-        44: 1,  # 't'
-        63: 0,  # 'u'
-        34: 0,  # '\xa0'
-        55: 0,  # '´'
-        48: 0,  # '¼'
-        39: 0,  # '½'
-        57: 0,  # '¾'
-        30: 0,  # 'Ö°'
-        59: 0,  # 'Ö±'
-        41: 0,  # 'Ö²'
-        33: 0,  # 'Ö´'
-        37: 0,  # 'Öµ'
-        36: 0,  # 'Ö¶'
-        31: 0,  # 'Ö·'
-        29: 0,  # 'Ö¸'
-        35: 0,  # 'Ö¹'
-        62: 0,  # 'Ö»'
-        28: 0,  # 'Ö¼'
-        38: 0,  # '×'
-        45: 0,  # 'ׂ'
-        9: 1,  # '×'
-        8: 0,  # 'ב'
-        20: 0,  # '×’'
-        16: 0,  # 'ד'
-        3: 1,  # '×”'
-        2: 1,  # 'ו'
-        24: 1,  # '×–'
-        14: 0,  # '×—'
-        22: 0,  # 'ט'
-        1: 1,  # '×™'
-        25: 0,  # 'ך'
-        15: 1,  # '×›'
-        4: 1,  # 'ל'
-        11: 0,  # '×'
-        6: 1,  # 'מ'
-        23: 0,  # 'ן'
-        12: 1,  # '× '
-        19: 0,  # 'ס'
-        13: 0,  # '×¢'
-        26: 0,  # '×£'
-        18: 1,  # 'פ'
-        27: 0,  # '×¥'
-        21: 0,  # 'צ'
-        17: 0,  # '×§'
-        7: 1,  # 'ר'
-        10: 1,  # 'ש'
-        5: 1,  # 'ת'
-        32: 0,  # '–'
-        52: 0,  # '’'
-        47: 0,  # '“'
-        46: 1,  # 'â€'
-        58: 0,  # '†'
-        40: 2,  # '…'
-    },
-}
-
-# 255: Undefined characters that did not exist in training text
-# 254: Carriage/Return
-# 253: symbol (punctuation) that does not belong to word
-# 252: 0 - 9
-# 251: Control characters
-
-# Character Mapping Table(s):
-WINDOWS_1255_HEBREW_CHAR_TO_ORDER = {
-     0: 255,  # '\x00'
-     1: 255,  # '\x01'
-     2: 255,  # '\x02'
-     3: 255,  # '\x03'
-     4: 255,  # '\x04'
-     5: 255,  # '\x05'
-     6: 255,  # '\x06'
-     7: 255,  # '\x07'
-     8: 255,  # '\x08'
-     9: 255,  # '\t'
-     10: 254,  # '\n'
-     11: 255,  # '\x0b'
-     12: 255,  # '\x0c'
-     13: 254,  # '\r'
-     14: 255,  # '\x0e'
-     15: 255,  # '\x0f'
-     16: 255,  # '\x10'
-     17: 255,  # '\x11'
-     18: 255,  # '\x12'
-     19: 255,  # '\x13'
-     20: 255,  # '\x14'
-     21: 255,  # '\x15'
-     22: 255,  # '\x16'
-     23: 255,  # '\x17'
-     24: 255,  # '\x18'
-     25: 255,  # '\x19'
-     26: 255,  # '\x1a'
-     27: 255,  # '\x1b'
-     28: 255,  # '\x1c'
-     29: 255,  # '\x1d'
-     30: 255,  # '\x1e'
-     31: 255,  # '\x1f'
-     32: 253,  # ' '
-     33: 253,  # '!'
-     34: 253,  # '"'
-     35: 253,  # '#'
-     36: 253,  # '$'
-     37: 253,  # '%'
-     38: 253,  # '&'
-     39: 253,  # "'"
-     40: 253,  # '('
-     41: 253,  # ')'
-     42: 253,  # '*'
-     43: 253,  # '+'
-     44: 253,  # ','
-     45: 253,  # '-'
-     46: 253,  # '.'
-     47: 253,  # '/'
-     48: 252,  # '0'
-     49: 252,  # '1'
-     50: 252,  # '2'
-     51: 252,  # '3'
-     52: 252,  # '4'
-     53: 252,  # '5'
-     54: 252,  # '6'
-     55: 252,  # '7'
-     56: 252,  # '8'
-     57: 252,  # '9'
-     58: 253,  # ':'
-     59: 253,  # ';'
-     60: 253,  # '<'
-     61: 253,  # '='
-     62: 253,  # '>'
-     63: 253,  # '?'
-     64: 253,  # '@'
-     65: 69,  # 'A'
-     66: 91,  # 'B'
-     67: 79,  # 'C'
-     68: 80,  # 'D'
-     69: 92,  # 'E'
-     70: 89,  # 'F'
-     71: 97,  # 'G'
-     72: 90,  # 'H'
-     73: 68,  # 'I'
-     74: 111,  # 'J'
-     75: 112,  # 'K'
-     76: 82,  # 'L'
-     77: 73,  # 'M'
-     78: 95,  # 'N'
-     79: 85,  # 'O'
-     80: 78,  # 'P'
-     81: 121,  # 'Q'
-     82: 86,  # 'R'
-     83: 71,  # 'S'
-     84: 67,  # 'T'
-     85: 102,  # 'U'
-     86: 107,  # 'V'
-     87: 84,  # 'W'
-     88: 114,  # 'X'
-     89: 103,  # 'Y'
-     90: 115,  # 'Z'
-     91: 253,  # '['
-     92: 253,  # '\\'
-     93: 253,  # ']'
-     94: 253,  # '^'
-     95: 253,  # '_'
-     96: 253,  # '`'
-     97: 50,  # 'a'
-     98: 74,  # 'b'
-     99: 60,  # 'c'
-     100: 61,  # 'd'
-     101: 42,  # 'e'
-     102: 76,  # 'f'
-     103: 70,  # 'g'
-     104: 64,  # 'h'
-     105: 53,  # 'i'
-     106: 105,  # 'j'
-     107: 93,  # 'k'
-     108: 56,  # 'l'
-     109: 65,  # 'm'
-     110: 54,  # 'n'
-     111: 49,  # 'o'
-     112: 66,  # 'p'
-     113: 110,  # 'q'
-     114: 51,  # 'r'
-     115: 43,  # 's'
-     116: 44,  # 't'
-     117: 63,  # 'u'
-     118: 81,  # 'v'
-     119: 77,  # 'w'
-     120: 98,  # 'x'
-     121: 75,  # 'y'
-     122: 108,  # 'z'
-     123: 253,  # '{'
-     124: 253,  # '|'
-     125: 253,  # '}'
-     126: 253,  # '~'
-     127: 253,  # '\x7f'
-     128: 124,  # '€'
-     129: 202,  # None
-     130: 203,  # '‚'
-     131: 204,  # 'Æ’'
-     132: 205,  # '„'
-     133: 40,  # '…'
-     134: 58,  # '†'
-     135: 206,  # '‡'
-     136: 207,  # 'ˆ'
-     137: 208,  # '‰'
-     138: 209,  # None
-     139: 210,  # '‹'
-     140: 211,  # None
-     141: 212,  # None
-     142: 213,  # None
-     143: 214,  # None
-     144: 215,  # None
-     145: 83,  # '‘'
-     146: 52,  # '’'
-     147: 47,  # '“'
-     148: 46,  # 'â€'
-     149: 72,  # '•'
-     150: 32,  # '–'
-     151: 94,  # '—'
-     152: 216,  # '˜'
-     153: 113,  # 'â„¢'
-     154: 217,  # None
-     155: 109,  # '›'
-     156: 218,  # None
-     157: 219,  # None
-     158: 220,  # None
-     159: 221,  # None
-     160: 34,  # '\xa0'
-     161: 116,  # '¡'
-     162: 222,  # '¢'
-     163: 118,  # '£'
-     164: 100,  # '₪'
-     165: 223,  # 'Â¥'
-     166: 224,  # '¦'
-     167: 117,  # '§'
-     168: 119,  # '¨'
-     169: 104,  # '©'
-     170: 125,  # '×'
-     171: 225,  # '«'
-     172: 226,  # '¬'
-     173: 87,  # '\xad'
-     174: 99,  # '®'
-     175: 227,  # '¯'
-     176: 106,  # '°'
-     177: 122,  # '±'
-     178: 123,  # '²'
-     179: 228,  # '³'
-     180: 55,  # '´'
-     181: 229,  # 'µ'
-     182: 230,  # '¶'
-     183: 101,  # '·'
-     184: 231,  # '¸'
-     185: 232,  # '¹'
-     186: 120,  # '÷'
-     187: 233,  # '»'
-     188: 48,  # '¼'
-     189: 39,  # '½'
-     190: 57,  # '¾'
-     191: 234,  # '¿'
-     192: 30,  # 'Ö°'
-     193: 59,  # 'Ö±'
-     194: 41,  # 'Ö²'
-     195: 88,  # 'Ö³'
-     196: 33,  # 'Ö´'
-     197: 37,  # 'Öµ'
-     198: 36,  # 'Ö¶'
-     199: 31,  # 'Ö·'
-     200: 29,  # 'Ö¸'
-     201: 35,  # 'Ö¹'
-     202: 235,  # None
-     203: 62,  # 'Ö»'
-     204: 28,  # 'Ö¼'
-     205: 236,  # 'Ö½'
-     206: 126,  # 'Ö¾'
-     207: 237,  # 'Ö¿'
-     208: 238,  # '×€'
-     209: 38,  # '×'
-     210: 45,  # 'ׂ'
-     211: 239,  # '׃'
-     212: 240,  # '×°'
-     213: 241,  # '×±'
-     214: 242,  # 'ײ'
-     215: 243,  # '׳'
-     216: 127,  # '×´'
-     217: 244,  # None
-     218: 245,  # None
-     219: 246,  # None
-     220: 247,  # None
-     221: 248,  # None
-     222: 249,  # None
-     223: 250,  # None
-     224: 9,  # '×'
-     225: 8,  # 'ב'
-     226: 20,  # '×’'
-     227: 16,  # 'ד'
-     228: 3,  # '×”'
-     229: 2,  # 'ו'
-     230: 24,  # '×–'
-     231: 14,  # '×—'
-     232: 22,  # 'ט'
-     233: 1,  # '×™'
-     234: 25,  # 'ך'
-     235: 15,  # '×›'
-     236: 4,  # 'ל'
-     237: 11,  # '×'
-     238: 6,  # 'מ'
-     239: 23,  # 'ן'
-     240: 12,  # '× '
-     241: 19,  # 'ס'
-     242: 13,  # '×¢'
-     243: 26,  # '×£'
-     244: 18,  # 'פ'
-     245: 27,  # '×¥'
-     246: 21,  # 'צ'
-     247: 17,  # '×§'
-     248: 7,  # 'ר'
-     249: 10,  # 'ש'
-     250: 5,  # 'ת'
-     251: 251,  # None
-     252: 252,  # None
-     253: 128,  # '\u200e'
-     254: 96,  # '\u200f'
-     255: 253,  # None
-}
-
-WINDOWS_1255_HEBREW_MODEL = SingleByteCharSetModel(charset_name='windows-1255',
-                                                   language='Hebrew',
-                                                   char_to_order_map=WINDOWS_1255_HEBREW_CHAR_TO_ORDER,
-                                                   language_model=HEBREW_LANG_MODEL,
-                                                   typical_positive_ratio=0.984004,
-                                                   keep_ascii_letters=False,
-                                                   alphabet='×בגדהוזחטיךכל×מןנסעףפץצקרשתװױײ')
-
diff --git a/lib/sub_repos/chardet/chardet/langhungarianmodel.py b/lib/sub_repos/chardet/chardet/langhungarianmodel.py
deleted file mode 100644
index 24a097f52..000000000
--- a/lib/sub_repos/chardet/chardet/langhungarianmodel.py
+++ /dev/null
@@ -1,4650 +0,0 @@
-#!/usr/bin/env python
-# -*- coding: utf-8 -*-
-
-from chardet.sbcharsetprober import SingleByteCharSetModel
-
-
-# 3: Positive
-# 2: Likely
-# 1: Unlikely
-# 0: Negative
-
-HUNGARIAN_LANG_MODEL = {
-    28: {  # 'A'
-        28: 0,  # 'A'
-        40: 1,  # 'B'
-        54: 1,  # 'C'
-        45: 2,  # 'D'
-        32: 1,  # 'E'
-        50: 1,  # 'F'
-        49: 2,  # 'G'
-        38: 1,  # 'H'
-        39: 2,  # 'I'
-        53: 1,  # 'J'
-        36: 2,  # 'K'
-        41: 2,  # 'L'
-        34: 1,  # 'M'
-        35: 2,  # 'N'
-        47: 1,  # 'O'
-        46: 2,  # 'P'
-        43: 2,  # 'R'
-        33: 2,  # 'S'
-        37: 2,  # 'T'
-        57: 1,  # 'U'
-        48: 1,  # 'V'
-        55: 1,  # 'Y'
-        52: 2,  # 'Z'
-        2: 0,  # 'a'
-        18: 1,  # 'b'
-        26: 1,  # 'c'
-        17: 2,  # 'd'
-        1: 1,  # 'e'
-        27: 1,  # 'f'
-        12: 1,  # 'g'
-        20: 1,  # 'h'
-        9: 1,  # 'i'
-        22: 1,  # 'j'
-        7: 2,  # 'k'
-        6: 2,  # 'l'
-        13: 2,  # 'm'
-        4: 2,  # 'n'
-        8: 0,  # 'o'
-        23: 2,  # 'p'
-        10: 2,  # 'r'
-        5: 1,  # 's'
-        3: 1,  # 't'
-        21: 1,  # 'u'
-        19: 1,  # 'v'
-        62: 1,  # 'x'
-        16: 0,  # 'y'
-        11: 3,  # 'z'
-        51: 1,  # 'Ã'
-        44: 0,  # 'É'
-        61: 1,  # 'Ã'
-        58: 0,  # 'Ó'
-        59: 0,  # 'Ö'
-        60: 0,  # 'Ú'
-        63: 0,  # 'Ü'
-        14: 0,  # 'á'
-        15: 0,  # 'é'
-        30: 0,  # 'í'
-        25: 0,  # 'ó'
-        24: 0,  # 'ö'
-        31: 0,  # 'ú'
-        29: 0,  # 'ü'
-        42: 0,  # 'Å‘'
-        56: 0,  # 'ű'
-    },
-    40: {  # 'B'
-        28: 2,  # 'A'
-        40: 1,  # 'B'
-        54: 1,  # 'C'
-        45: 1,  # 'D'
-        32: 2,  # 'E'
-        50: 0,  # 'F'
-        49: 0,  # 'G'
-        38: 0,  # 'H'
-        39: 1,  # 'I'
-        53: 1,  # 'J'
-        36: 1,  # 'K'
-        41: 1,  # 'L'
-        34: 0,  # 'M'
-        35: 1,  # 'N'
-        47: 2,  # 'O'
-        46: 0,  # 'P'
-        43: 1,  # 'R'
-        33: 1,  # 'S'
-        37: 1,  # 'T'
-        57: 1,  # 'U'
-        48: 1,  # 'V'
-        55: 0,  # 'Y'
-        52: 0,  # 'Z'
-        2: 2,  # 'a'
-        18: 0,  # 'b'
-        26: 0,  # 'c'
-        17: 0,  # 'd'
-        1: 3,  # 'e'
-        27: 0,  # 'f'
-        12: 0,  # 'g'
-        20: 0,  # 'h'
-        9: 2,  # 'i'
-        22: 1,  # 'j'
-        7: 0,  # 'k'
-        6: 1,  # 'l'
-        13: 0,  # 'm'
-        4: 0,  # 'n'
-        8: 2,  # 'o'
-        23: 1,  # 'p'
-        10: 2,  # 'r'
-        5: 0,  # 's'
-        3: 0,  # 't'
-        21: 3,  # 'u'
-        19: 0,  # 'v'
-        62: 0,  # 'x'
-        16: 1,  # 'y'
-        11: 0,  # 'z'
-        51: 1,  # 'Ã'
-        44: 1,  # 'É'
-        61: 1,  # 'Ã'
-        58: 1,  # 'Ó'
-        59: 1,  # 'Ö'
-        60: 1,  # 'Ú'
-        63: 1,  # 'Ü'
-        14: 2,  # 'á'
-        15: 2,  # 'é'
-        30: 1,  # 'í'
-        25: 1,  # 'ó'
-        24: 1,  # 'ö'
-        31: 1,  # 'ú'
-        29: 1,  # 'ü'
-        42: 1,  # 'Å‘'
-        56: 1,  # 'ű'
-    },
-    54: {  # 'C'
-        28: 1,  # 'A'
-        40: 1,  # 'B'
-        54: 1,  # 'C'
-        45: 1,  # 'D'
-        32: 1,  # 'E'
-        50: 0,  # 'F'
-        49: 0,  # 'G'
-        38: 1,  # 'H'
-        39: 2,  # 'I'
-        53: 1,  # 'J'
-        36: 1,  # 'K'
-        41: 1,  # 'L'
-        34: 1,  # 'M'
-        35: 0,  # 'N'
-        47: 1,  # 'O'
-        46: 1,  # 'P'
-        43: 1,  # 'R'
-        33: 2,  # 'S'
-        37: 1,  # 'T'
-        57: 1,  # 'U'
-        48: 0,  # 'V'
-        55: 1,  # 'Y'
-        52: 1,  # 'Z'
-        2: 2,  # 'a'
-        18: 0,  # 'b'
-        26: 0,  # 'c'
-        17: 0,  # 'd'
-        1: 1,  # 'e'
-        27: 0,  # 'f'
-        12: 0,  # 'g'
-        20: 1,  # 'h'
-        9: 1,  # 'i'
-        22: 0,  # 'j'
-        7: 0,  # 'k'
-        6: 1,  # 'l'
-        13: 0,  # 'm'
-        4: 0,  # 'n'
-        8: 2,  # 'o'
-        23: 0,  # 'p'
-        10: 1,  # 'r'
-        5: 3,  # 's'
-        3: 0,  # 't'
-        21: 1,  # 'u'
-        19: 0,  # 'v'
-        62: 0,  # 'x'
-        16: 1,  # 'y'
-        11: 1,  # 'z'
-        51: 1,  # 'Ã'
-        44: 1,  # 'É'
-        61: 1,  # 'Ã'
-        58: 0,  # 'Ó'
-        59: 0,  # 'Ö'
-        60: 0,  # 'Ú'
-        63: 0,  # 'Ü'
-        14: 1,  # 'á'
-        15: 1,  # 'é'
-        30: 1,  # 'í'
-        25: 1,  # 'ó'
-        24: 0,  # 'ö'
-        31: 0,  # 'ú'
-        29: 0,  # 'ü'
-        42: 0,  # 'Å‘'
-        56: 0,  # 'ű'
-    },
-    45: {  # 'D'
-        28: 2,  # 'A'
-        40: 1,  # 'B'
-        54: 0,  # 'C'
-        45: 1,  # 'D'
-        32: 2,  # 'E'
-        50: 1,  # 'F'
-        49: 1,  # 'G'
-        38: 1,  # 'H'
-        39: 2,  # 'I'
-        53: 1,  # 'J'
-        36: 1,  # 'K'
-        41: 0,  # 'L'
-        34: 1,  # 'M'
-        35: 1,  # 'N'
-        47: 2,  # 'O'
-        46: 0,  # 'P'
-        43: 1,  # 'R'
-        33: 1,  # 'S'
-        37: 1,  # 'T'
-        57: 1,  # 'U'
-        48: 1,  # 'V'
-        55: 1,  # 'Y'
-        52: 1,  # 'Z'
-        2: 2,  # 'a'
-        18: 0,  # 'b'
-        26: 0,  # 'c'
-        17: 0,  # 'd'
-        1: 3,  # 'e'
-        27: 0,  # 'f'
-        12: 0,  # 'g'
-        20: 0,  # 'h'
-        9: 1,  # 'i'
-        22: 0,  # 'j'
-        7: 0,  # 'k'
-        6: 0,  # 'l'
-        13: 0,  # 'm'
-        4: 0,  # 'n'
-        8: 1,  # 'o'
-        23: 0,  # 'p'
-        10: 2,  # 'r'
-        5: 0,  # 's'
-        3: 0,  # 't'
-        21: 2,  # 'u'
-        19: 0,  # 'v'
-        62: 0,  # 'x'
-        16: 1,  # 'y'
-        11: 1,  # 'z'
-        51: 1,  # 'Ã'
-        44: 1,  # 'É'
-        61: 1,  # 'Ã'
-        58: 1,  # 'Ó'
-        59: 1,  # 'Ö'
-        60: 1,  # 'Ú'
-        63: 1,  # 'Ü'
-        14: 1,  # 'á'
-        15: 1,  # 'é'
-        30: 1,  # 'í'
-        25: 1,  # 'ó'
-        24: 1,  # 'ö'
-        31: 1,  # 'ú'
-        29: 1,  # 'ü'
-        42: 1,  # 'Å‘'
-        56: 0,  # 'ű'
-    },
-    32: {  # 'E'
-        28: 1,  # 'A'
-        40: 1,  # 'B'
-        54: 1,  # 'C'
-        45: 1,  # 'D'
-        32: 1,  # 'E'
-        50: 1,  # 'F'
-        49: 2,  # 'G'
-        38: 1,  # 'H'
-        39: 1,  # 'I'
-        53: 1,  # 'J'
-        36: 2,  # 'K'
-        41: 2,  # 'L'
-        34: 2,  # 'M'
-        35: 2,  # 'N'
-        47: 1,  # 'O'
-        46: 1,  # 'P'
-        43: 2,  # 'R'
-        33: 2,  # 'S'
-        37: 2,  # 'T'
-        57: 1,  # 'U'
-        48: 1,  # 'V'
-        55: 1,  # 'Y'
-        52: 1,  # 'Z'
-        2: 1,  # 'a'
-        18: 1,  # 'b'
-        26: 1,  # 'c'
-        17: 2,  # 'd'
-        1: 1,  # 'e'
-        27: 1,  # 'f'
-        12: 3,  # 'g'
-        20: 1,  # 'h'
-        9: 1,  # 'i'
-        22: 1,  # 'j'
-        7: 1,  # 'k'
-        6: 2,  # 'l'
-        13: 2,  # 'm'
-        4: 2,  # 'n'
-        8: 0,  # 'o'
-        23: 1,  # 'p'
-        10: 2,  # 'r'
-        5: 2,  # 's'
-        3: 1,  # 't'
-        21: 2,  # 'u'
-        19: 1,  # 'v'
-        62: 1,  # 'x'
-        16: 0,  # 'y'
-        11: 3,  # 'z'
-        51: 1,  # 'Ã'
-        44: 1,  # 'É'
-        61: 0,  # 'Ã'
-        58: 1,  # 'Ó'
-        59: 1,  # 'Ö'
-        60: 0,  # 'Ú'
-        63: 1,  # 'Ü'
-        14: 0,  # 'á'
-        15: 0,  # 'é'
-        30: 0,  # 'í'
-        25: 0,  # 'ó'
-        24: 1,  # 'ö'
-        31: 0,  # 'ú'
-        29: 0,  # 'ü'
-        42: 0,  # 'Å‘'
-        56: 0,  # 'ű'
-    },
-    50: {  # 'F'
-        28: 1,  # 'A'
-        40: 0,  # 'B'
-        54: 0,  # 'C'
-        45: 0,  # 'D'
-        32: 1,  # 'E'
-        50: 1,  # 'F'
-        49: 0,  # 'G'
-        38: 1,  # 'H'
-        39: 1,  # 'I'
-        53: 1,  # 'J'
-        36: 1,  # 'K'
-        41: 1,  # 'L'
-        34: 1,  # 'M'
-        35: 1,  # 'N'
-        47: 1,  # 'O'
-        46: 0,  # 'P'
-        43: 1,  # 'R'
-        33: 0,  # 'S'
-        37: 1,  # 'T'
-        57: 1,  # 'U'
-        48: 0,  # 'V'
-        55: 1,  # 'Y'
-        52: 0,  # 'Z'
-        2: 2,  # 'a'
-        18: 0,  # 'b'
-        26: 0,  # 'c'
-        17: 0,  # 'd'
-        1: 2,  # 'e'
-        27: 1,  # 'f'
-        12: 0,  # 'g'
-        20: 0,  # 'h'
-        9: 2,  # 'i'
-        22: 1,  # 'j'
-        7: 0,  # 'k'
-        6: 1,  # 'l'
-        13: 0,  # 'm'
-        4: 0,  # 'n'
-        8: 2,  # 'o'
-        23: 0,  # 'p'
-        10: 2,  # 'r'
-        5: 0,  # 's'
-        3: 0,  # 't'
-        21: 1,  # 'u'
-        19: 0,  # 'v'
-        62: 0,  # 'x'
-        16: 0,  # 'y'
-        11: 0,  # 'z'
-        51: 1,  # 'Ã'
-        44: 1,  # 'É'
-        61: 0,  # 'Ã'
-        58: 1,  # 'Ó'
-        59: 1,  # 'Ö'
-        60: 0,  # 'Ú'
-        63: 1,  # 'Ü'
-        14: 1,  # 'á'
-        15: 1,  # 'é'
-        30: 0,  # 'í'
-        25: 0,  # 'ó'
-        24: 2,  # 'ö'
-        31: 1,  # 'ú'
-        29: 1,  # 'ü'
-        42: 1,  # 'Å‘'
-        56: 1,  # 'ű'
-    },
-    49: {  # 'G'
-        28: 2,  # 'A'
-        40: 1,  # 'B'
-        54: 1,  # 'C'
-        45: 1,  # 'D'
-        32: 2,  # 'E'
-        50: 1,  # 'F'
-        49: 1,  # 'G'
-        38: 1,  # 'H'
-        39: 1,  # 'I'
-        53: 1,  # 'J'
-        36: 1,  # 'K'
-        41: 1,  # 'L'
-        34: 1,  # 'M'
-        35: 1,  # 'N'
-        47: 1,  # 'O'
-        46: 1,  # 'P'
-        43: 1,  # 'R'
-        33: 1,  # 'S'
-        37: 1,  # 'T'
-        57: 1,  # 'U'
-        48: 1,  # 'V'
-        55: 2,  # 'Y'
-        52: 1,  # 'Z'
-        2: 2,  # 'a'
-        18: 0,  # 'b'
-        26: 0,  # 'c'
-        17: 0,  # 'd'
-        1: 2,  # 'e'
-        27: 0,  # 'f'
-        12: 0,  # 'g'
-        20: 0,  # 'h'
-        9: 1,  # 'i'
-        22: 0,  # 'j'
-        7: 0,  # 'k'
-        6: 1,  # 'l'
-        13: 0,  # 'm'
-        4: 0,  # 'n'
-        8: 2,  # 'o'
-        23: 0,  # 'p'
-        10: 2,  # 'r'
-        5: 0,  # 's'
-        3: 0,  # 't'
-        21: 1,  # 'u'
-        19: 0,  # 'v'
-        62: 0,  # 'x'
-        16: 2,  # 'y'
-        11: 0,  # 'z'
-        51: 1,  # 'Ã'
-        44: 1,  # 'É'
-        61: 1,  # 'Ã'
-        58: 1,  # 'Ó'
-        59: 1,  # 'Ö'
-        60: 1,  # 'Ú'
-        63: 1,  # 'Ü'
-        14: 1,  # 'á'
-        15: 1,  # 'é'
-        30: 0,  # 'í'
-        25: 1,  # 'ó'
-        24: 1,  # 'ö'
-        31: 1,  # 'ú'
-        29: 1,  # 'ü'
-        42: 1,  # 'Å‘'
-        56: 0,  # 'ű'
-    },
-    38: {  # 'H'
-        28: 2,  # 'A'
-        40: 1,  # 'B'
-        54: 1,  # 'C'
-        45: 0,  # 'D'
-        32: 1,  # 'E'
-        50: 0,  # 'F'
-        49: 0,  # 'G'
-        38: 0,  # 'H'
-        39: 1,  # 'I'
-        53: 0,  # 'J'
-        36: 0,  # 'K'
-        41: 1,  # 'L'
-        34: 0,  # 'M'
-        35: 0,  # 'N'
-        47: 1,  # 'O'
-        46: 0,  # 'P'
-        43: 1,  # 'R'
-        33: 1,  # 'S'
-        37: 1,  # 'T'
-        57: 1,  # 'U'
-        48: 0,  # 'V'
-        55: 1,  # 'Y'
-        52: 0,  # 'Z'
-        2: 3,  # 'a'
-        18: 0,  # 'b'
-        26: 0,  # 'c'
-        17: 0,  # 'd'
-        1: 2,  # 'e'
-        27: 0,  # 'f'
-        12: 0,  # 'g'
-        20: 0,  # 'h'
-        9: 2,  # 'i'
-        22: 1,  # 'j'
-        7: 0,  # 'k'
-        6: 1,  # 'l'
-        13: 1,  # 'm'
-        4: 0,  # 'n'
-        8: 3,  # 'o'
-        23: 0,  # 'p'
-        10: 1,  # 'r'
-        5: 0,  # 's'
-        3: 0,  # 't'
-        21: 2,  # 'u'
-        19: 0,  # 'v'
-        62: 0,  # 'x'
-        16: 1,  # 'y'
-        11: 0,  # 'z'
-        51: 2,  # 'Ã'
-        44: 2,  # 'É'
-        61: 1,  # 'Ã'
-        58: 1,  # 'Ó'
-        59: 1,  # 'Ö'
-        60: 1,  # 'Ú'
-        63: 1,  # 'Ü'
-        14: 2,  # 'á'
-        15: 1,  # 'é'
-        30: 2,  # 'í'
-        25: 1,  # 'ó'
-        24: 1,  # 'ö'
-        31: 1,  # 'ú'
-        29: 1,  # 'ü'
-        42: 1,  # 'Å‘'
-        56: 1,  # 'ű'
-    },
-    39: {  # 'I'
-        28: 2,  # 'A'
-        40: 1,  # 'B'
-        54: 1,  # 'C'
-        45: 1,  # 'D'
-        32: 1,  # 'E'
-        50: 1,  # 'F'
-        49: 1,  # 'G'
-        38: 1,  # 'H'
-        39: 2,  # 'I'
-        53: 1,  # 'J'
-        36: 2,  # 'K'
-        41: 2,  # 'L'
-        34: 1,  # 'M'
-        35: 2,  # 'N'
-        47: 1,  # 'O'
-        46: 1,  # 'P'
-        43: 1,  # 'R'
-        33: 2,  # 'S'
-        37: 1,  # 'T'
-        57: 1,  # 'U'
-        48: 1,  # 'V'
-        55: 0,  # 'Y'
-        52: 2,  # 'Z'
-        2: 0,  # 'a'
-        18: 1,  # 'b'
-        26: 1,  # 'c'
-        17: 2,  # 'd'
-        1: 0,  # 'e'
-        27: 1,  # 'f'
-        12: 2,  # 'g'
-        20: 1,  # 'h'
-        9: 0,  # 'i'
-        22: 1,  # 'j'
-        7: 1,  # 'k'
-        6: 2,  # 'l'
-        13: 2,  # 'm'
-        4: 1,  # 'n'
-        8: 0,  # 'o'
-        23: 1,  # 'p'
-        10: 2,  # 'r'
-        5: 2,  # 's'
-        3: 2,  # 't'
-        21: 0,  # 'u'
-        19: 1,  # 'v'
-        62: 0,  # 'x'
-        16: 0,  # 'y'
-        11: 1,  # 'z'
-        51: 1,  # 'Ã'
-        44: 1,  # 'É'
-        61: 0,  # 'Ã'
-        58: 1,  # 'Ó'
-        59: 1,  # 'Ö'
-        60: 1,  # 'Ú'
-        63: 1,  # 'Ü'
-        14: 0,  # 'á'
-        15: 0,  # 'é'
-        30: 0,  # 'í'
-        25: 0,  # 'ó'
-        24: 0,  # 'ö'
-        31: 0,  # 'ú'
-        29: 0,  # 'ü'
-        42: 0,  # 'Å‘'
-        56: 0,  # 'ű'
-    },
-    53: {  # 'J'
-        28: 2,  # 'A'
-        40: 0,  # 'B'
-        54: 1,  # 'C'
-        45: 1,  # 'D'
-        32: 2,  # 'E'
-        50: 0,  # 'F'
-        49: 0,  # 'G'
-        38: 1,  # 'H'
-        39: 1,  # 'I'
-        53: 1,  # 'J'
-        36: 1,  # 'K'
-        41: 1,  # 'L'
-        34: 1,  # 'M'
-        35: 1,  # 'N'
-        47: 1,  # 'O'
-        46: 0,  # 'P'
-        43: 0,  # 'R'
-        33: 1,  # 'S'
-        37: 1,  # 'T'
-        57: 1,  # 'U'
-        48: 0,  # 'V'
-        55: 0,  # 'Y'
-        52: 1,  # 'Z'
-        2: 2,  # 'a'
-        18: 0,  # 'b'
-        26: 0,  # 'c'
-        17: 0,  # 'd'
-        1: 2,  # 'e'
-        27: 0,  # 'f'
-        12: 0,  # 'g'
-        20: 0,  # 'h'
-        9: 1,  # 'i'
-        22: 0,  # 'j'
-        7: 0,  # 'k'
-        6: 0,  # 'l'
-        13: 0,  # 'm'
-        4: 0,  # 'n'
-        8: 1,  # 'o'
-        23: 0,  # 'p'
-        10: 0,  # 'r'
-        5: 0,  # 's'
-        3: 0,  # 't'
-        21: 2,  # 'u'
-        19: 0,  # 'v'
-        62: 0,  # 'x'
-        16: 0,  # 'y'
-        11: 0,  # 'z'
-        51: 1,  # 'Ã'
-        44: 1,  # 'É'
-        61: 0,  # 'Ã'
-        58: 1,  # 'Ó'
-        59: 1,  # 'Ö'
-        60: 1,  # 'Ú'
-        63: 1,  # 'Ü'
-        14: 2,  # 'á'
-        15: 1,  # 'é'
-        30: 0,  # 'í'
-        25: 2,  # 'ó'
-        24: 2,  # 'ö'
-        31: 1,  # 'ú'
-        29: 0,  # 'ü'
-        42: 1,  # 'Å‘'
-        56: 0,  # 'ű'
-    },
-    36: {  # 'K'
-        28: 2,  # 'A'
-        40: 1,  # 'B'
-        54: 1,  # 'C'
-        45: 1,  # 'D'
-        32: 2,  # 'E'
-        50: 1,  # 'F'
-        49: 0,  # 'G'
-        38: 1,  # 'H'
-        39: 2,  # 'I'
-        53: 1,  # 'J'
-        36: 1,  # 'K'
-        41: 1,  # 'L'
-        34: 1,  # 'M'
-        35: 1,  # 'N'
-        47: 2,  # 'O'
-        46: 0,  # 'P'
-        43: 1,  # 'R'
-        33: 1,  # 'S'
-        37: 1,  # 'T'
-        57: 1,  # 'U'
-        48: 1,  # 'V'
-        55: 1,  # 'Y'
-        52: 0,  # 'Z'
-        2: 2,  # 'a'
-        18: 0,  # 'b'
-        26: 0,  # 'c'
-        17: 0,  # 'd'
-        1: 2,  # 'e'
-        27: 1,  # 'f'
-        12: 0,  # 'g'
-        20: 1,  # 'h'
-        9: 3,  # 'i'
-        22: 0,  # 'j'
-        7: 0,  # 'k'
-        6: 1,  # 'l'
-        13: 1,  # 'm'
-        4: 1,  # 'n'
-        8: 2,  # 'o'
-        23: 0,  # 'p'
-        10: 2,  # 'r'
-        5: 0,  # 's'
-        3: 0,  # 't'
-        21: 1,  # 'u'
-        19: 1,  # 'v'
-        62: 0,  # 'x'
-        16: 1,  # 'y'
-        11: 0,  # 'z'
-        51: 1,  # 'Ã'
-        44: 1,  # 'É'
-        61: 1,  # 'Ã'
-        58: 1,  # 'Ó'
-        59: 2,  # 'Ö'
-        60: 1,  # 'Ú'
-        63: 1,  # 'Ü'
-        14: 2,  # 'á'
-        15: 2,  # 'é'
-        30: 1,  # 'í'
-        25: 1,  # 'ó'
-        24: 2,  # 'ö'
-        31: 1,  # 'ú'
-        29: 2,  # 'ü'
-        42: 1,  # 'Å‘'
-        56: 0,  # 'ű'
-    },
-    41: {  # 'L'
-        28: 2,  # 'A'
-        40: 1,  # 'B'
-        54: 1,  # 'C'
-        45: 1,  # 'D'
-        32: 2,  # 'E'
-        50: 1,  # 'F'
-        49: 1,  # 'G'
-        38: 1,  # 'H'
-        39: 2,  # 'I'
-        53: 1,  # 'J'
-        36: 1,  # 'K'
-        41: 2,  # 'L'
-        34: 1,  # 'M'
-        35: 1,  # 'N'
-        47: 2,  # 'O'
-        46: 0,  # 'P'
-        43: 1,  # 'R'
-        33: 1,  # 'S'
-        37: 2,  # 'T'
-        57: 1,  # 'U'
-        48: 1,  # 'V'
-        55: 1,  # 'Y'
-        52: 1,  # 'Z'
-        2: 2,  # 'a'
-        18: 0,  # 'b'
-        26: 0,  # 'c'
-        17: 0,  # 'd'
-        1: 3,  # 'e'
-        27: 0,  # 'f'
-        12: 0,  # 'g'
-        20: 0,  # 'h'
-        9: 2,  # 'i'
-        22: 1,  # 'j'
-        7: 0,  # 'k'
-        6: 1,  # 'l'
-        13: 0,  # 'm'
-        4: 0,  # 'n'
-        8: 2,  # 'o'
-        23: 0,  # 'p'
-        10: 0,  # 'r'
-        5: 0,  # 's'
-        3: 0,  # 't'
-        21: 2,  # 'u'
-        19: 0,  # 'v'
-        62: 0,  # 'x'
-        16: 1,  # 'y'
-        11: 0,  # 'z'
-        51: 2,  # 'Ã'
-        44: 1,  # 'É'
-        61: 1,  # 'Ã'
-        58: 1,  # 'Ó'
-        59: 1,  # 'Ö'
-        60: 1,  # 'Ú'
-        63: 1,  # 'Ü'
-        14: 2,  # 'á'
-        15: 1,  # 'é'
-        30: 1,  # 'í'
-        25: 1,  # 'ó'
-        24: 1,  # 'ö'
-        31: 0,  # 'ú'
-        29: 1,  # 'ü'
-        42: 0,  # 'Å‘'
-        56: 0,  # 'ű'
-    },
-    34: {  # 'M'
-        28: 2,  # 'A'
-        40: 1,  # 'B'
-        54: 0,  # 'C'
-        45: 0,  # 'D'
-        32: 2,  # 'E'
-        50: 1,  # 'F'
-        49: 0,  # 'G'
-        38: 1,  # 'H'
-        39: 2,  # 'I'
-        53: 1,  # 'J'
-        36: 1,  # 'K'
-        41: 1,  # 'L'
-        34: 1,  # 'M'
-        35: 1,  # 'N'
-        47: 1,  # 'O'
-        46: 1,  # 'P'
-        43: 1,  # 'R'
-        33: 1,  # 'S'
-        37: 1,  # 'T'
-        57: 1,  # 'U'
-        48: 1,  # 'V'
-        55: 1,  # 'Y'
-        52: 1,  # 'Z'
-        2: 3,  # 'a'
-        18: 0,  # 'b'
-        26: 1,  # 'c'
-        17: 0,  # 'd'
-        1: 3,  # 'e'
-        27: 0,  # 'f'
-        12: 0,  # 'g'
-        20: 0,  # 'h'
-        9: 3,  # 'i'
-        22: 0,  # 'j'
-        7: 0,  # 'k'
-        6: 0,  # 'l'
-        13: 1,  # 'm'
-        4: 1,  # 'n'
-        8: 3,  # 'o'
-        23: 0,  # 'p'
-        10: 1,  # 'r'
-        5: 0,  # 's'
-        3: 0,  # 't'
-        21: 2,  # 'u'
-        19: 0,  # 'v'
-        62: 0,  # 'x'
-        16: 1,  # 'y'
-        11: 0,  # 'z'
-        51: 2,  # 'Ã'
-        44: 1,  # 'É'
-        61: 1,  # 'Ã'
-        58: 1,  # 'Ó'
-        59: 1,  # 'Ö'
-        60: 1,  # 'Ú'
-        63: 1,  # 'Ü'
-        14: 2,  # 'á'
-        15: 2,  # 'é'
-        30: 1,  # 'í'
-        25: 1,  # 'ó'
-        24: 1,  # 'ö'
-        31: 1,  # 'ú'
-        29: 1,  # 'ü'
-        42: 0,  # 'Å‘'
-        56: 1,  # 'ű'
-    },
-    35: {  # 'N'
-        28: 2,  # 'A'
-        40: 1,  # 'B'
-        54: 1,  # 'C'
-        45: 2,  # 'D'
-        32: 2,  # 'E'
-        50: 1,  # 'F'
-        49: 1,  # 'G'
-        38: 1,  # 'H'
-        39: 1,  # 'I'
-        53: 1,  # 'J'
-        36: 1,  # 'K'
-        41: 1,  # 'L'
-        34: 1,  # 'M'
-        35: 1,  # 'N'
-        47: 1,  # 'O'
-        46: 1,  # 'P'
-        43: 1,  # 'R'
-        33: 1,  # 'S'
-        37: 2,  # 'T'
-        57: 1,  # 'U'
-        48: 1,  # 'V'
-        55: 2,  # 'Y'
-        52: 1,  # 'Z'
-        2: 3,  # 'a'
-        18: 0,  # 'b'
-        26: 0,  # 'c'
-        17: 0,  # 'd'
-        1: 3,  # 'e'
-        27: 0,  # 'f'
-        12: 0,  # 'g'
-        20: 0,  # 'h'
-        9: 2,  # 'i'
-        22: 0,  # 'j'
-        7: 0,  # 'k'
-        6: 0,  # 'l'
-        13: 0,  # 'm'
-        4: 1,  # 'n'
-        8: 2,  # 'o'
-        23: 0,  # 'p'
-        10: 0,  # 'r'
-        5: 0,  # 's'
-        3: 0,  # 't'
-        21: 1,  # 'u'
-        19: 0,  # 'v'
-        62: 0,  # 'x'
-        16: 2,  # 'y'
-        11: 0,  # 'z'
-        51: 1,  # 'Ã'
-        44: 1,  # 'É'
-        61: 1,  # 'Ã'
-        58: 1,  # 'Ó'
-        59: 1,  # 'Ö'
-        60: 1,  # 'Ú'
-        63: 1,  # 'Ü'
-        14: 1,  # 'á'
-        15: 2,  # 'é'
-        30: 1,  # 'í'
-        25: 1,  # 'ó'
-        24: 1,  # 'ö'
-        31: 0,  # 'ú'
-        29: 0,  # 'ü'
-        42: 1,  # 'Å‘'
-        56: 0,  # 'ű'
-    },
-    47: {  # 'O'
-        28: 1,  # 'A'
-        40: 1,  # 'B'
-        54: 1,  # 'C'
-        45: 1,  # 'D'
-        32: 1,  # 'E'
-        50: 1,  # 'F'
-        49: 1,  # 'G'
-        38: 1,  # 'H'
-        39: 1,  # 'I'
-        53: 1,  # 'J'
-        36: 2,  # 'K'
-        41: 2,  # 'L'
-        34: 2,  # 'M'
-        35: 2,  # 'N'
-        47: 1,  # 'O'
-        46: 1,  # 'P'
-        43: 2,  # 'R'
-        33: 2,  # 'S'
-        37: 2,  # 'T'
-        57: 1,  # 'U'
-        48: 1,  # 'V'
-        55: 1,  # 'Y'
-        52: 1,  # 'Z'
-        2: 0,  # 'a'
-        18: 1,  # 'b'
-        26: 1,  # 'c'
-        17: 1,  # 'd'
-        1: 1,  # 'e'
-        27: 1,  # 'f'
-        12: 1,  # 'g'
-        20: 1,  # 'h'
-        9: 1,  # 'i'
-        22: 1,  # 'j'
-        7: 2,  # 'k'
-        6: 2,  # 'l'
-        13: 1,  # 'm'
-        4: 1,  # 'n'
-        8: 1,  # 'o'
-        23: 1,  # 'p'
-        10: 2,  # 'r'
-        5: 1,  # 's'
-        3: 2,  # 't'
-        21: 1,  # 'u'
-        19: 0,  # 'v'
-        62: 1,  # 'x'
-        16: 0,  # 'y'
-        11: 1,  # 'z'
-        51: 1,  # 'Ã'
-        44: 1,  # 'É'
-        61: 0,  # 'Ã'
-        58: 1,  # 'Ó'
-        59: 0,  # 'Ö'
-        60: 0,  # 'Ú'
-        63: 0,  # 'Ü'
-        14: 0,  # 'á'
-        15: 0,  # 'é'
-        30: 0,  # 'í'
-        25: 0,  # 'ó'
-        24: 0,  # 'ö'
-        31: 0,  # 'ú'
-        29: 0,  # 'ü'
-        42: 0,  # 'Å‘'
-        56: 0,  # 'ű'
-    },
-    46: {  # 'P'
-        28: 1,  # 'A'
-        40: 1,  # 'B'
-        54: 1,  # 'C'
-        45: 1,  # 'D'
-        32: 1,  # 'E'
-        50: 1,  # 'F'
-        49: 1,  # 'G'
-        38: 1,  # 'H'
-        39: 1,  # 'I'
-        53: 1,  # 'J'
-        36: 1,  # 'K'
-        41: 1,  # 'L'
-        34: 0,  # 'M'
-        35: 1,  # 'N'
-        47: 1,  # 'O'
-        46: 1,  # 'P'
-        43: 2,  # 'R'
-        33: 1,  # 'S'
-        37: 1,  # 'T'
-        57: 1,  # 'U'
-        48: 1,  # 'V'
-        55: 0,  # 'Y'
-        52: 1,  # 'Z'
-        2: 2,  # 'a'
-        18: 0,  # 'b'
-        26: 0,  # 'c'
-        17: 0,  # 'd'
-        1: 2,  # 'e'
-        27: 1,  # 'f'
-        12: 0,  # 'g'
-        20: 1,  # 'h'
-        9: 2,  # 'i'
-        22: 0,  # 'j'
-        7: 0,  # 'k'
-        6: 1,  # 'l'
-        13: 0,  # 'm'
-        4: 1,  # 'n'
-        8: 2,  # 'o'
-        23: 0,  # 'p'
-        10: 2,  # 'r'
-        5: 1,  # 's'
-        3: 0,  # 't'
-        21: 1,  # 'u'
-        19: 0,  # 'v'
-        62: 0,  # 'x'
-        16: 1,  # 'y'
-        11: 0,  # 'z'
-        51: 2,  # 'Ã'
-        44: 1,  # 'É'
-        61: 1,  # 'Ã'
-        58: 1,  # 'Ó'
-        59: 1,  # 'Ö'
-        60: 0,  # 'Ú'
-        63: 1,  # 'Ü'
-        14: 3,  # 'á'
-        15: 2,  # 'é'
-        30: 0,  # 'í'
-        25: 1,  # 'ó'
-        24: 1,  # 'ö'
-        31: 0,  # 'ú'
-        29: 1,  # 'ü'
-        42: 1,  # 'Å‘'
-        56: 0,  # 'ű'
-    },
-    43: {  # 'R'
-        28: 2,  # 'A'
-        40: 1,  # 'B'
-        54: 1,  # 'C'
-        45: 1,  # 'D'
-        32: 2,  # 'E'
-        50: 1,  # 'F'
-        49: 1,  # 'G'
-        38: 1,  # 'H'
-        39: 2,  # 'I'
-        53: 1,  # 'J'
-        36: 1,  # 'K'
-        41: 1,  # 'L'
-        34: 1,  # 'M'
-        35: 1,  # 'N'
-        47: 2,  # 'O'
-        46: 1,  # 'P'
-        43: 1,  # 'R'
-        33: 2,  # 'S'
-        37: 2,  # 'T'
-        57: 1,  # 'U'
-        48: 1,  # 'V'
-        55: 1,  # 'Y'
-        52: 1,  # 'Z'
-        2: 2,  # 'a'
-        18: 0,  # 'b'
-        26: 0,  # 'c'
-        17: 0,  # 'd'
-        1: 2,  # 'e'
-        27: 0,  # 'f'
-        12: 0,  # 'g'
-        20: 1,  # 'h'
-        9: 2,  # 'i'
-        22: 0,  # 'j'
-        7: 0,  # 'k'
-        6: 0,  # 'l'
-        13: 0,  # 'm'
-        4: 0,  # 'n'
-        8: 2,  # 'o'
-        23: 0,  # 'p'
-        10: 0,  # 'r'
-        5: 0,  # 's'
-        3: 0,  # 't'
-        21: 1,  # 'u'
-        19: 0,  # 'v'
-        62: 0,  # 'x'
-        16: 1,  # 'y'
-        11: 0,  # 'z'
-        51: 2,  # 'Ã'
-        44: 1,  # 'É'
-        61: 1,  # 'Ã'
-        58: 2,  # 'Ó'
-        59: 1,  # 'Ö'
-        60: 1,  # 'Ú'
-        63: 1,  # 'Ü'
-        14: 2,  # 'á'
-        15: 2,  # 'é'
-        30: 1,  # 'í'
-        25: 2,  # 'ó'
-        24: 1,  # 'ö'
-        31: 1,  # 'ú'
-        29: 1,  # 'ü'
-        42: 0,  # 'Å‘'
-        56: 0,  # 'ű'
-    },
-    33: {  # 'S'
-        28: 2,  # 'A'
-        40: 1,  # 'B'
-        54: 1,  # 'C'
-        45: 1,  # 'D'
-        32: 2,  # 'E'
-        50: 1,  # 'F'
-        49: 1,  # 'G'
-        38: 1,  # 'H'
-        39: 2,  # 'I'
-        53: 1,  # 'J'
-        36: 1,  # 'K'
-        41: 1,  # 'L'
-        34: 1,  # 'M'
-        35: 1,  # 'N'
-        47: 2,  # 'O'
-        46: 1,  # 'P'
-        43: 1,  # 'R'
-        33: 2,  # 'S'
-        37: 2,  # 'T'
-        57: 1,  # 'U'
-        48: 1,  # 'V'
-        55: 1,  # 'Y'
-        52: 3,  # 'Z'
-        2: 2,  # 'a'
-        18: 0,  # 'b'
-        26: 1,  # 'c'
-        17: 0,  # 'd'
-        1: 2,  # 'e'
-        27: 0,  # 'f'
-        12: 0,  # 'g'
-        20: 1,  # 'h'
-        9: 2,  # 'i'
-        22: 0,  # 'j'
-        7: 1,  # 'k'
-        6: 1,  # 'l'
-        13: 1,  # 'm'
-        4: 0,  # 'n'
-        8: 2,  # 'o'
-        23: 1,  # 'p'
-        10: 0,  # 'r'
-        5: 0,  # 's'
-        3: 1,  # 't'
-        21: 1,  # 'u'
-        19: 1,  # 'v'
-        62: 0,  # 'x'
-        16: 1,  # 'y'
-        11: 3,  # 'z'
-        51: 2,  # 'Ã'
-        44: 1,  # 'É'
-        61: 1,  # 'Ã'
-        58: 1,  # 'Ó'
-        59: 1,  # 'Ö'
-        60: 1,  # 'Ú'
-        63: 1,  # 'Ü'
-        14: 2,  # 'á'
-        15: 1,  # 'é'
-        30: 1,  # 'í'
-        25: 1,  # 'ó'
-        24: 1,  # 'ö'
-        31: 1,  # 'ú'
-        29: 1,  # 'ü'
-        42: 1,  # 'Å‘'
-        56: 1,  # 'ű'
-    },
-    37: {  # 'T'
-        28: 2,  # 'A'
-        40: 1,  # 'B'
-        54: 1,  # 'C'
-        45: 1,  # 'D'
-        32: 2,  # 'E'
-        50: 1,  # 'F'
-        49: 1,  # 'G'
-        38: 1,  # 'H'
-        39: 2,  # 'I'
-        53: 1,  # 'J'
-        36: 1,  # 'K'
-        41: 1,  # 'L'
-        34: 1,  # 'M'
-        35: 1,  # 'N'
-        47: 2,  # 'O'
-        46: 1,  # 'P'
-        43: 2,  # 'R'
-        33: 1,  # 'S'
-        37: 2,  # 'T'
-        57: 1,  # 'U'
-        48: 1,  # 'V'
-        55: 1,  # 'Y'
-        52: 1,  # 'Z'
-        2: 2,  # 'a'
-        18: 0,  # 'b'
-        26: 0,  # 'c'
-        17: 0,  # 'd'
-        1: 2,  # 'e'
-        27: 0,  # 'f'
-        12: 0,  # 'g'
-        20: 1,  # 'h'
-        9: 2,  # 'i'
-        22: 0,  # 'j'
-        7: 0,  # 'k'
-        6: 0,  # 'l'
-        13: 0,  # 'm'
-        4: 0,  # 'n'
-        8: 2,  # 'o'
-        23: 0,  # 'p'
-        10: 1,  # 'r'
-        5: 1,  # 's'
-        3: 0,  # 't'
-        21: 2,  # 'u'
-        19: 0,  # 'v'
-        62: 0,  # 'x'
-        16: 1,  # 'y'
-        11: 1,  # 'z'
-        51: 2,  # 'Ã'
-        44: 2,  # 'É'
-        61: 1,  # 'Ã'
-        58: 1,  # 'Ó'
-        59: 1,  # 'Ö'
-        60: 1,  # 'Ú'
-        63: 1,  # 'Ü'
-        14: 2,  # 'á'
-        15: 1,  # 'é'
-        30: 1,  # 'í'
-        25: 1,  # 'ó'
-        24: 2,  # 'ö'
-        31: 1,  # 'ú'
-        29: 1,  # 'ü'
-        42: 1,  # 'Å‘'
-        56: 1,  # 'ű'
-    },
-    57: {  # 'U'
-        28: 1,  # 'A'
-        40: 1,  # 'B'
-        54: 1,  # 'C'
-        45: 1,  # 'D'
-        32: 1,  # 'E'
-        50: 1,  # 'F'
-        49: 1,  # 'G'
-        38: 1,  # 'H'
-        39: 1,  # 'I'
-        53: 1,  # 'J'
-        36: 1,  # 'K'
-        41: 1,  # 'L'
-        34: 1,  # 'M'
-        35: 1,  # 'N'
-        47: 1,  # 'O'
-        46: 1,  # 'P'
-        43: 1,  # 'R'
-        33: 2,  # 'S'
-        37: 1,  # 'T'
-        57: 0,  # 'U'
-        48: 1,  # 'V'
-        55: 0,  # 'Y'
-        52: 1,  # 'Z'
-        2: 0,  # 'a'
-        18: 1,  # 'b'
-        26: 1,  # 'c'
-        17: 1,  # 'd'
-        1: 1,  # 'e'
-        27: 0,  # 'f'
-        12: 2,  # 'g'
-        20: 0,  # 'h'
-        9: 0,  # 'i'
-        22: 1,  # 'j'
-        7: 1,  # 'k'
-        6: 1,  # 'l'
-        13: 1,  # 'm'
-        4: 1,  # 'n'
-        8: 0,  # 'o'
-        23: 1,  # 'p'
-        10: 1,  # 'r'
-        5: 1,  # 's'
-        3: 1,  # 't'
-        21: 0,  # 'u'
-        19: 0,  # 'v'
-        62: 0,  # 'x'
-        16: 0,  # 'y'
-        11: 1,  # 'z'
-        51: 0,  # 'Ã'
-        44: 0,  # 'É'
-        61: 1,  # 'Ã'
-        58: 0,  # 'Ó'
-        59: 0,  # 'Ö'
-        60: 0,  # 'Ú'
-        63: 0,  # 'Ü'
-        14: 0,  # 'á'
-        15: 0,  # 'é'
-        30: 0,  # 'í'
-        25: 0,  # 'ó'
-        24: 0,  # 'ö'
-        31: 0,  # 'ú'
-        29: 0,  # 'ü'
-        42: 0,  # 'Å‘'
-        56: 0,  # 'ű'
-    },
-    48: {  # 'V'
-        28: 2,  # 'A'
-        40: 0,  # 'B'
-        54: 0,  # 'C'
-        45: 1,  # 'D'
-        32: 2,  # 'E'
-        50: 1,  # 'F'
-        49: 0,  # 'G'
-        38: 0,  # 'H'
-        39: 2,  # 'I'
-        53: 1,  # 'J'
-        36: 1,  # 'K'
-        41: 0,  # 'L'
-        34: 1,  # 'M'
-        35: 1,  # 'N'
-        47: 1,  # 'O'
-        46: 1,  # 'P'
-        43: 1,  # 'R'
-        33: 1,  # 'S'
-        37: 1,  # 'T'
-        57: 1,  # 'U'
-        48: 1,  # 'V'
-        55: 1,  # 'Y'
-        52: 0,  # 'Z'
-        2: 3,  # 'a'
-        18: 0,  # 'b'
-        26: 0,  # 'c'
-        17: 0,  # 'd'
-        1: 2,  # 'e'
-        27: 0,  # 'f'
-        12: 0,  # 'g'
-        20: 0,  # 'h'
-        9: 2,  # 'i'
-        22: 0,  # 'j'
-        7: 0,  # 'k'
-        6: 1,  # 'l'
-        13: 0,  # 'm'
-        4: 0,  # 'n'
-        8: 2,  # 'o'
-        23: 0,  # 'p'
-        10: 0,  # 'r'
-        5: 0,  # 's'
-        3: 0,  # 't'
-        21: 1,  # 'u'
-        19: 0,  # 'v'
-        62: 0,  # 'x'
-        16: 0,  # 'y'
-        11: 0,  # 'z'
-        51: 2,  # 'Ã'
-        44: 2,  # 'É'
-        61: 1,  # 'Ã'
-        58: 1,  # 'Ó'
-        59: 1,  # 'Ö'
-        60: 0,  # 'Ú'
-        63: 1,  # 'Ü'
-        14: 2,  # 'á'
-        15: 2,  # 'é'
-        30: 1,  # 'í'
-        25: 0,  # 'ó'
-        24: 1,  # 'ö'
-        31: 0,  # 'ú'
-        29: 0,  # 'ü'
-        42: 0,  # 'Å‘'
-        56: 0,  # 'ű'
-    },
-    55: {  # 'Y'
-        28: 2,  # 'A'
-        40: 1,  # 'B'
-        54: 1,  # 'C'
-        45: 1,  # 'D'
-        32: 2,  # 'E'
-        50: 1,  # 'F'
-        49: 1,  # 'G'
-        38: 1,  # 'H'
-        39: 1,  # 'I'
-        53: 1,  # 'J'
-        36: 1,  # 'K'
-        41: 1,  # 'L'
-        34: 1,  # 'M'
-        35: 1,  # 'N'
-        47: 1,  # 'O'
-        46: 1,  # 'P'
-        43: 1,  # 'R'
-        33: 1,  # 'S'
-        37: 1,  # 'T'
-        57: 1,  # 'U'
-        48: 1,  # 'V'
-        55: 0,  # 'Y'
-        52: 2,  # 'Z'
-        2: 1,  # 'a'
-        18: 0,  # 'b'
-        26: 0,  # 'c'
-        17: 1,  # 'd'
-        1: 1,  # 'e'
-        27: 0,  # 'f'
-        12: 0,  # 'g'
-        20: 0,  # 'h'
-        9: 0,  # 'i'
-        22: 0,  # 'j'
-        7: 0,  # 'k'
-        6: 0,  # 'l'
-        13: 0,  # 'm'
-        4: 0,  # 'n'
-        8: 1,  # 'o'
-        23: 1,  # 'p'
-        10: 0,  # 'r'
-        5: 0,  # 's'
-        3: 0,  # 't'
-        21: 0,  # 'u'
-        19: 1,  # 'v'
-        62: 0,  # 'x'
-        16: 0,  # 'y'
-        11: 0,  # 'z'
-        51: 1,  # 'Ã'
-        44: 1,  # 'É'
-        61: 1,  # 'Ã'
-        58: 1,  # 'Ó'
-        59: 1,  # 'Ö'
-        60: 1,  # 'Ú'
-        63: 1,  # 'Ü'
-        14: 0,  # 'á'
-        15: 0,  # 'é'
-        30: 0,  # 'í'
-        25: 0,  # 'ó'
-        24: 0,  # 'ö'
-        31: 0,  # 'ú'
-        29: 0,  # 'ü'
-        42: 0,  # 'Å‘'
-        56: 0,  # 'ű'
-    },
-    52: {  # 'Z'
-        28: 2,  # 'A'
-        40: 1,  # 'B'
-        54: 0,  # 'C'
-        45: 1,  # 'D'
-        32: 2,  # 'E'
-        50: 1,  # 'F'
-        49: 1,  # 'G'
-        38: 1,  # 'H'
-        39: 2,  # 'I'
-        53: 1,  # 'J'
-        36: 1,  # 'K'
-        41: 1,  # 'L'
-        34: 1,  # 'M'
-        35: 1,  # 'N'
-        47: 2,  # 'O'
-        46: 1,  # 'P'
-        43: 1,  # 'R'
-        33: 2,  # 'S'
-        37: 1,  # 'T'
-        57: 1,  # 'U'
-        48: 1,  # 'V'
-        55: 1,  # 'Y'
-        52: 1,  # 'Z'
-        2: 1,  # 'a'
-        18: 0,  # 'b'
-        26: 0,  # 'c'
-        17: 0,  # 'd'
-        1: 1,  # 'e'
-        27: 0,  # 'f'
-        12: 0,  # 'g'
-        20: 0,  # 'h'
-        9: 1,  # 'i'
-        22: 0,  # 'j'
-        7: 0,  # 'k'
-        6: 0,  # 'l'
-        13: 0,  # 'm'
-        4: 1,  # 'n'
-        8: 1,  # 'o'
-        23: 0,  # 'p'
-        10: 1,  # 'r'
-        5: 2,  # 's'
-        3: 0,  # 't'
-        21: 1,  # 'u'
-        19: 0,  # 'v'
-        62: 0,  # 'x'
-        16: 0,  # 'y'
-        11: 0,  # 'z'
-        51: 2,  # 'Ã'
-        44: 1,  # 'É'
-        61: 1,  # 'Ã'
-        58: 1,  # 'Ó'
-        59: 1,  # 'Ö'
-        60: 1,  # 'Ú'
-        63: 1,  # 'Ü'
-        14: 1,  # 'á'
-        15: 1,  # 'é'
-        30: 0,  # 'í'
-        25: 0,  # 'ó'
-        24: 1,  # 'ö'
-        31: 1,  # 'ú'
-        29: 1,  # 'ü'
-        42: 0,  # 'Å‘'
-        56: 0,  # 'ű'
-    },
-    2: {  # 'a'
-        28: 0,  # 'A'
-        40: 0,  # 'B'
-        54: 0,  # 'C'
-        45: 0,  # 'D'
-        32: 0,  # 'E'
-        50: 0,  # 'F'
-        49: 0,  # 'G'
-        38: 0,  # 'H'
-        39: 0,  # 'I'
-        53: 0,  # 'J'
-        36: 0,  # 'K'
-        41: 0,  # 'L'
-        34: 0,  # 'M'
-        35: 0,  # 'N'
-        47: 0,  # 'O'
-        46: 0,  # 'P'
-        43: 0,  # 'R'
-        33: 0,  # 'S'
-        37: 0,  # 'T'
-        57: 0,  # 'U'
-        48: 0,  # 'V'
-        55: 0,  # 'Y'
-        52: 0,  # 'Z'
-        2: 1,  # 'a'
-        18: 3,  # 'b'
-        26: 3,  # 'c'
-        17: 3,  # 'd'
-        1: 2,  # 'e'
-        27: 2,  # 'f'
-        12: 3,  # 'g'
-        20: 3,  # 'h'
-        9: 3,  # 'i'
-        22: 3,  # 'j'
-        7: 3,  # 'k'
-        6: 3,  # 'l'
-        13: 3,  # 'm'
-        4: 3,  # 'n'
-        8: 2,  # 'o'
-        23: 3,  # 'p'
-        10: 3,  # 'r'
-        5: 3,  # 's'
-        3: 3,  # 't'
-        21: 3,  # 'u'
-        19: 3,  # 'v'
-        62: 1,  # 'x'
-        16: 2,  # 'y'
-        11: 3,  # 'z'
-        51: 0,  # 'Ã'
-        44: 0,  # 'É'
-        61: 0,  # 'Ã'
-        58: 0,  # 'Ó'
-        59: 0,  # 'Ö'
-        60: 0,  # 'Ú'
-        63: 0,  # 'Ü'
-        14: 1,  # 'á'
-        15: 1,  # 'é'
-        30: 1,  # 'í'
-        25: 1,  # 'ó'
-        24: 1,  # 'ö'
-        31: 1,  # 'ú'
-        29: 1,  # 'ü'
-        42: 0,  # 'Å‘'
-        56: 0,  # 'ű'
-    },
-    18: {  # 'b'
-        28: 0,  # 'A'
-        40: 0,  # 'B'
-        54: 0,  # 'C'
-        45: 0,  # 'D'
-        32: 0,  # 'E'
-        50: 0,  # 'F'
-        49: 0,  # 'G'
-        38: 0,  # 'H'
-        39: 0,  # 'I'
-        53: 0,  # 'J'
-        36: 0,  # 'K'
-        41: 0,  # 'L'
-        34: 0,  # 'M'
-        35: 0,  # 'N'
-        47: 0,  # 'O'
-        46: 0,  # 'P'
-        43: 0,  # 'R'
-        33: 0,  # 'S'
-        37: 0,  # 'T'
-        57: 0,  # 'U'
-        48: 0,  # 'V'
-        55: 0,  # 'Y'
-        52: 0,  # 'Z'
-        2: 3,  # 'a'
-        18: 3,  # 'b'
-        26: 1,  # 'c'
-        17: 1,  # 'd'
-        1: 3,  # 'e'
-        27: 1,  # 'f'
-        12: 1,  # 'g'
-        20: 1,  # 'h'
-        9: 3,  # 'i'
-        22: 2,  # 'j'
-        7: 2,  # 'k'
-        6: 2,  # 'l'
-        13: 1,  # 'm'
-        4: 2,  # 'n'
-        8: 3,  # 'o'
-        23: 1,  # 'p'
-        10: 3,  # 'r'
-        5: 2,  # 's'
-        3: 1,  # 't'
-        21: 3,  # 'u'
-        19: 1,  # 'v'
-        62: 0,  # 'x'
-        16: 1,  # 'y'
-        11: 1,  # 'z'
-        51: 0,  # 'Ã'
-        44: 0,  # 'É'
-        61: 0,  # 'Ã'
-        58: 0,  # 'Ó'
-        59: 0,  # 'Ö'
-        60: 0,  # 'Ú'
-        63: 0,  # 'Ü'
-        14: 3,  # 'á'
-        15: 3,  # 'é'
-        30: 2,  # 'í'
-        25: 3,  # 'ó'
-        24: 2,  # 'ö'
-        31: 2,  # 'ú'
-        29: 2,  # 'ü'
-        42: 2,  # 'Å‘'
-        56: 1,  # 'ű'
-    },
-    26: {  # 'c'
-        28: 0,  # 'A'
-        40: 0,  # 'B'
-        54: 1,  # 'C'
-        45: 0,  # 'D'
-        32: 0,  # 'E'
-        50: 0,  # 'F'
-        49: 1,  # 'G'
-        38: 0,  # 'H'
-        39: 0,  # 'I'
-        53: 0,  # 'J'
-        36: 0,  # 'K'
-        41: 0,  # 'L'
-        34: 0,  # 'M'
-        35: 0,  # 'N'
-        47: 0,  # 'O'
-        46: 0,  # 'P'
-        43: 0,  # 'R'
-        33: 0,  # 'S'
-        37: 0,  # 'T'
-        57: 0,  # 'U'
-        48: 0,  # 'V'
-        55: 0,  # 'Y'
-        52: 0,  # 'Z'
-        2: 2,  # 'a'
-        18: 1,  # 'b'
-        26: 2,  # 'c'
-        17: 1,  # 'd'
-        1: 3,  # 'e'
-        27: 1,  # 'f'
-        12: 1,  # 'g'
-        20: 3,  # 'h'
-        9: 3,  # 'i'
-        22: 1,  # 'j'
-        7: 2,  # 'k'
-        6: 1,  # 'l'
-        13: 1,  # 'm'
-        4: 1,  # 'n'
-        8: 3,  # 'o'
-        23: 1,  # 'p'
-        10: 2,  # 'r'
-        5: 3,  # 's'
-        3: 2,  # 't'
-        21: 2,  # 'u'
-        19: 1,  # 'v'
-        62: 0,  # 'x'
-        16: 1,  # 'y'
-        11: 2,  # 'z'
-        51: 0,  # 'Ã'
-        44: 0,  # 'É'
-        61: 0,  # 'Ã'
-        58: 0,  # 'Ó'
-        59: 0,  # 'Ö'
-        60: 0,  # 'Ú'
-        63: 0,  # 'Ü'
-        14: 2,  # 'á'
-        15: 2,  # 'é'
-        30: 2,  # 'í'
-        25: 1,  # 'ó'
-        24: 1,  # 'ö'
-        31: 1,  # 'ú'
-        29: 1,  # 'ü'
-        42: 0,  # 'Å‘'
-        56: 0,  # 'ű'
-    },
-    17: {  # 'd'
-        28: 0,  # 'A'
-        40: 0,  # 'B'
-        54: 0,  # 'C'
-        45: 0,  # 'D'
-        32: 0,  # 'E'
-        50: 0,  # 'F'
-        49: 0,  # 'G'
-        38: 0,  # 'H'
-        39: 0,  # 'I'
-        53: 0,  # 'J'
-        36: 0,  # 'K'
-        41: 0,  # 'L'
-        34: 0,  # 'M'
-        35: 0,  # 'N'
-        47: 0,  # 'O'
-        46: 0,  # 'P'
-        43: 0,  # 'R'
-        33: 0,  # 'S'
-        37: 0,  # 'T'
-        57: 0,  # 'U'
-        48: 0,  # 'V'
-        55: 0,  # 'Y'
-        52: 0,  # 'Z'
-        2: 3,  # 'a'
-        18: 2,  # 'b'
-        26: 1,  # 'c'
-        17: 2,  # 'd'
-        1: 3,  # 'e'
-        27: 1,  # 'f'
-        12: 1,  # 'g'
-        20: 2,  # 'h'
-        9: 3,  # 'i'
-        22: 3,  # 'j'
-        7: 2,  # 'k'
-        6: 1,  # 'l'
-        13: 2,  # 'm'
-        4: 3,  # 'n'
-        8: 3,  # 'o'
-        23: 1,  # 'p'
-        10: 3,  # 'r'
-        5: 3,  # 's'
-        3: 3,  # 't'
-        21: 3,  # 'u'
-        19: 3,  # 'v'
-        62: 0,  # 'x'
-        16: 2,  # 'y'
-        11: 2,  # 'z'
-        51: 0,  # 'Ã'
-        44: 0,  # 'É'
-        61: 0,  # 'Ã'
-        58: 0,  # 'Ó'
-        59: 0,  # 'Ö'
-        60: 0,  # 'Ú'
-        63: 0,  # 'Ü'
-        14: 3,  # 'á'
-        15: 3,  # 'é'
-        30: 3,  # 'í'
-        25: 3,  # 'ó'
-        24: 3,  # 'ö'
-        31: 2,  # 'ú'
-        29: 2,  # 'ü'
-        42: 2,  # 'Å‘'
-        56: 1,  # 'ű'
-    },
-    1: {  # 'e'
-        28: 0,  # 'A'
-        40: 0,  # 'B'
-        54: 0,  # 'C'
-        45: 0,  # 'D'
-        32: 0,  # 'E'
-        50: 0,  # 'F'
-        49: 0,  # 'G'
-        38: 0,  # 'H'
-        39: 0,  # 'I'
-        53: 0,  # 'J'
-        36: 0,  # 'K'
-        41: 0,  # 'L'
-        34: 0,  # 'M'
-        35: 0,  # 'N'
-        47: 0,  # 'O'
-        46: 0,  # 'P'
-        43: 0,  # 'R'
-        33: 0,  # 'S'
-        37: 0,  # 'T'
-        57: 0,  # 'U'
-        48: 0,  # 'V'
-        55: 0,  # 'Y'
-        52: 0,  # 'Z'
-        2: 2,  # 'a'
-        18: 3,  # 'b'
-        26: 3,  # 'c'
-        17: 3,  # 'd'
-        1: 2,  # 'e'
-        27: 3,  # 'f'
-        12: 3,  # 'g'
-        20: 3,  # 'h'
-        9: 3,  # 'i'
-        22: 3,  # 'j'
-        7: 3,  # 'k'
-        6: 3,  # 'l'
-        13: 3,  # 'm'
-        4: 3,  # 'n'
-        8: 2,  # 'o'
-        23: 3,  # 'p'
-        10: 3,  # 'r'
-        5: 3,  # 's'
-        3: 3,  # 't'
-        21: 2,  # 'u'
-        19: 3,  # 'v'
-        62: 2,  # 'x'
-        16: 2,  # 'y'
-        11: 3,  # 'z'
-        51: 0,  # 'Ã'
-        44: 0,  # 'É'
-        61: 0,  # 'Ã'
-        58: 0,  # 'Ó'
-        59: 0,  # 'Ö'
-        60: 0,  # 'Ú'
-        63: 0,  # 'Ü'
-        14: 3,  # 'á'
-        15: 1,  # 'é'
-        30: 1,  # 'í'
-        25: 1,  # 'ó'
-        24: 1,  # 'ö'
-        31: 1,  # 'ú'
-        29: 1,  # 'ü'
-        42: 0,  # 'Å‘'
-        56: 0,  # 'ű'
-    },
-    27: {  # 'f'
-        28: 0,  # 'A'
-        40: 0,  # 'B'
-        54: 0,  # 'C'
-        45: 0,  # 'D'
-        32: 0,  # 'E'
-        50: 0,  # 'F'
-        49: 0,  # 'G'
-        38: 0,  # 'H'
-        39: 0,  # 'I'
-        53: 0,  # 'J'
-        36: 0,  # 'K'
-        41: 0,  # 'L'
-        34: 0,  # 'M'
-        35: 0,  # 'N'
-        47: 0,  # 'O'
-        46: 0,  # 'P'
-        43: 0,  # 'R'
-        33: 0,  # 'S'
-        37: 0,  # 'T'
-        57: 0,  # 'U'
-        48: 0,  # 'V'
-        55: 0,  # 'Y'
-        52: 0,  # 'Z'
-        2: 3,  # 'a'
-        18: 1,  # 'b'
-        26: 1,  # 'c'
-        17: 1,  # 'd'
-        1: 3,  # 'e'
-        27: 2,  # 'f'
-        12: 1,  # 'g'
-        20: 1,  # 'h'
-        9: 3,  # 'i'
-        22: 2,  # 'j'
-        7: 1,  # 'k'
-        6: 1,  # 'l'
-        13: 1,  # 'm'
-        4: 1,  # 'n'
-        8: 3,  # 'o'
-        23: 0,  # 'p'
-        10: 3,  # 'r'
-        5: 1,  # 's'
-        3: 1,  # 't'
-        21: 2,  # 'u'
-        19: 1,  # 'v'
-        62: 0,  # 'x'
-        16: 1,  # 'y'
-        11: 0,  # 'z'
-        51: 0,  # 'Ã'
-        44: 0,  # 'É'
-        61: 0,  # 'Ã'
-        58: 0,  # 'Ó'
-        59: 0,  # 'Ö'
-        60: 0,  # 'Ú'
-        63: 0,  # 'Ü'
-        14: 3,  # 'á'
-        15: 3,  # 'é'
-        30: 1,  # 'í'
-        25: 1,  # 'ó'
-        24: 3,  # 'ö'
-        31: 1,  # 'ú'
-        29: 2,  # 'ü'
-        42: 1,  # 'Å‘'
-        56: 1,  # 'ű'
-    },
-    12: {  # 'g'
-        28: 0,  # 'A'
-        40: 0,  # 'B'
-        54: 0,  # 'C'
-        45: 0,  # 'D'
-        32: 0,  # 'E'
-        50: 0,  # 'F'
-        49: 0,  # 'G'
-        38: 0,  # 'H'
-        39: 0,  # 'I'
-        53: 0,  # 'J'
-        36: 0,  # 'K'
-        41: 0,  # 'L'
-        34: 0,  # 'M'
-        35: 0,  # 'N'
-        47: 0,  # 'O'
-        46: 0,  # 'P'
-        43: 0,  # 'R'
-        33: 0,  # 'S'
-        37: 0,  # 'T'
-        57: 0,  # 'U'
-        48: 0,  # 'V'
-        55: 0,  # 'Y'
-        52: 0,  # 'Z'
-        2: 3,  # 'a'
-        18: 3,  # 'b'
-        26: 2,  # 'c'
-        17: 2,  # 'd'
-        1: 3,  # 'e'
-        27: 2,  # 'f'
-        12: 3,  # 'g'
-        20: 3,  # 'h'
-        9: 3,  # 'i'
-        22: 3,  # 'j'
-        7: 2,  # 'k'
-        6: 3,  # 'l'
-        13: 2,  # 'm'
-        4: 3,  # 'n'
-        8: 3,  # 'o'
-        23: 1,  # 'p'
-        10: 3,  # 'r'
-        5: 3,  # 's'
-        3: 3,  # 't'
-        21: 3,  # 'u'
-        19: 3,  # 'v'
-        62: 0,  # 'x'
-        16: 3,  # 'y'
-        11: 2,  # 'z'
-        51: 0,  # 'Ã'
-        44: 0,  # 'É'
-        61: 0,  # 'Ã'
-        58: 0,  # 'Ó'
-        59: 0,  # 'Ö'
-        60: 0,  # 'Ú'
-        63: 0,  # 'Ü'
-        14: 3,  # 'á'
-        15: 3,  # 'é'
-        30: 2,  # 'í'
-        25: 3,  # 'ó'
-        24: 2,  # 'ö'
-        31: 2,  # 'ú'
-        29: 2,  # 'ü'
-        42: 2,  # 'Å‘'
-        56: 1,  # 'ű'
-    },
-    20: {  # 'h'
-        28: 0,  # 'A'
-        40: 0,  # 'B'
-        54: 0,  # 'C'
-        45: 0,  # 'D'
-        32: 0,  # 'E'
-        50: 0,  # 'F'
-        49: 0,  # 'G'
-        38: 0,  # 'H'
-        39: 0,  # 'I'
-        53: 0,  # 'J'
-        36: 0,  # 'K'
-        41: 0,  # 'L'
-        34: 0,  # 'M'
-        35: 0,  # 'N'
-        47: 0,  # 'O'
-        46: 0,  # 'P'
-        43: 0,  # 'R'
-        33: 0,  # 'S'
-        37: 0,  # 'T'
-        57: 0,  # 'U'
-        48: 0,  # 'V'
-        55: 0,  # 'Y'
-        52: 0,  # 'Z'
-        2: 3,  # 'a'
-        18: 1,  # 'b'
-        26: 1,  # 'c'
-        17: 0,  # 'd'
-        1: 3,  # 'e'
-        27: 0,  # 'f'
-        12: 1,  # 'g'
-        20: 2,  # 'h'
-        9: 3,  # 'i'
-        22: 1,  # 'j'
-        7: 1,  # 'k'
-        6: 1,  # 'l'
-        13: 1,  # 'm'
-        4: 1,  # 'n'
-        8: 3,  # 'o'
-        23: 0,  # 'p'
-        10: 1,  # 'r'
-        5: 2,  # 's'
-        3: 1,  # 't'
-        21: 3,  # 'u'
-        19: 1,  # 'v'
-        62: 0,  # 'x'
-        16: 2,  # 'y'
-        11: 0,  # 'z'
-        51: 0,  # 'Ã'
-        44: 0,  # 'É'
-        61: 0,  # 'Ã'
-        58: 0,  # 'Ó'
-        59: 0,  # 'Ö'
-        60: 0,  # 'Ú'
-        63: 0,  # 'Ü'
-        14: 3,  # 'á'
-        15: 3,  # 'é'
-        30: 3,  # 'í'
-        25: 2,  # 'ó'
-        24: 2,  # 'ö'
-        31: 2,  # 'ú'
-        29: 1,  # 'ü'
-        42: 1,  # 'Å‘'
-        56: 1,  # 'ű'
-    },
-    9: {  # 'i'
-        28: 0,  # 'A'
-        40: 0,  # 'B'
-        54: 0,  # 'C'
-        45: 0,  # 'D'
-        32: 0,  # 'E'
-        50: 0,  # 'F'
-        49: 0,  # 'G'
-        38: 0,  # 'H'
-        39: 0,  # 'I'
-        53: 0,  # 'J'
-        36: 0,  # 'K'
-        41: 0,  # 'L'
-        34: 0,  # 'M'
-        35: 0,  # 'N'
-        47: 0,  # 'O'
-        46: 0,  # 'P'
-        43: 0,  # 'R'
-        33: 0,  # 'S'
-        37: 0,  # 'T'
-        57: 0,  # 'U'
-        48: 0,  # 'V'
-        55: 0,  # 'Y'
-        52: 0,  # 'Z'
-        2: 3,  # 'a'
-        18: 3,  # 'b'
-        26: 3,  # 'c'
-        17: 3,  # 'd'
-        1: 3,  # 'e'
-        27: 3,  # 'f'
-        12: 3,  # 'g'
-        20: 3,  # 'h'
-        9: 2,  # 'i'
-        22: 2,  # 'j'
-        7: 3,  # 'k'
-        6: 3,  # 'l'
-        13: 3,  # 'm'
-        4: 3,  # 'n'
-        8: 2,  # 'o'
-        23: 2,  # 'p'
-        10: 3,  # 'r'
-        5: 3,  # 's'
-        3: 3,  # 't'
-        21: 3,  # 'u'
-        19: 3,  # 'v'
-        62: 1,  # 'x'
-        16: 1,  # 'y'
-        11: 3,  # 'z'
-        51: 0,  # 'Ã'
-        44: 0,  # 'É'
-        61: 0,  # 'Ã'
-        58: 0,  # 'Ó'
-        59: 0,  # 'Ö'
-        60: 0,  # 'Ú'
-        63: 0,  # 'Ü'
-        14: 3,  # 'á'
-        15: 2,  # 'é'
-        30: 1,  # 'í'
-        25: 3,  # 'ó'
-        24: 1,  # 'ö'
-        31: 2,  # 'ú'
-        29: 1,  # 'ü'
-        42: 0,  # 'Å‘'
-        56: 1,  # 'ű'
-    },
-    22: {  # 'j'
-        28: 0,  # 'A'
-        40: 0,  # 'B'
-        54: 0,  # 'C'
-        45: 0,  # 'D'
-        32: 0,  # 'E'
-        50: 0,  # 'F'
-        49: 0,  # 'G'
-        38: 0,  # 'H'
-        39: 0,  # 'I'
-        53: 0,  # 'J'
-        36: 0,  # 'K'
-        41: 0,  # 'L'
-        34: 0,  # 'M'
-        35: 0,  # 'N'
-        47: 0,  # 'O'
-        46: 0,  # 'P'
-        43: 0,  # 'R'
-        33: 0,  # 'S'
-        37: 0,  # 'T'
-        57: 0,  # 'U'
-        48: 0,  # 'V'
-        55: 0,  # 'Y'
-        52: 0,  # 'Z'
-        2: 3,  # 'a'
-        18: 2,  # 'b'
-        26: 1,  # 'c'
-        17: 3,  # 'd'
-        1: 3,  # 'e'
-        27: 1,  # 'f'
-        12: 1,  # 'g'
-        20: 2,  # 'h'
-        9: 1,  # 'i'
-        22: 2,  # 'j'
-        7: 2,  # 'k'
-        6: 2,  # 'l'
-        13: 1,  # 'm'
-        4: 2,  # 'n'
-        8: 3,  # 'o'
-        23: 1,  # 'p'
-        10: 2,  # 'r'
-        5: 2,  # 's'
-        3: 3,  # 't'
-        21: 3,  # 'u'
-        19: 1,  # 'v'
-        62: 0,  # 'x'
-        16: 0,  # 'y'
-        11: 2,  # 'z'
-        51: 0,  # 'Ã'
-        44: 0,  # 'É'
-        61: 0,  # 'Ã'
-        58: 0,  # 'Ó'
-        59: 0,  # 'Ö'
-        60: 0,  # 'Ú'
-        63: 0,  # 'Ü'
-        14: 3,  # 'á'
-        15: 3,  # 'é'
-        30: 1,  # 'í'
-        25: 3,  # 'ó'
-        24: 3,  # 'ö'
-        31: 3,  # 'ú'
-        29: 2,  # 'ü'
-        42: 1,  # 'Å‘'
-        56: 1,  # 'ű'
-    },
-    7: {  # 'k'
-        28: 0,  # 'A'
-        40: 0,  # 'B'
-        54: 0,  # 'C'
-        45: 0,  # 'D'
-        32: 0,  # 'E'
-        50: 0,  # 'F'
-        49: 0,  # 'G'
-        38: 0,  # 'H'
-        39: 0,  # 'I'
-        53: 0,  # 'J'
-        36: 0,  # 'K'
-        41: 0,  # 'L'
-        34: 0,  # 'M'
-        35: 0,  # 'N'
-        47: 0,  # 'O'
-        46: 0,  # 'P'
-        43: 0,  # 'R'
-        33: 0,  # 'S'
-        37: 0,  # 'T'
-        57: 0,  # 'U'
-        48: 0,  # 'V'
-        55: 0,  # 'Y'
-        52: 0,  # 'Z'
-        2: 3,  # 'a'
-        18: 3,  # 'b'
-        26: 2,  # 'c'
-        17: 1,  # 'd'
-        1: 3,  # 'e'
-        27: 1,  # 'f'
-        12: 1,  # 'g'
-        20: 2,  # 'h'
-        9: 3,  # 'i'
-        22: 2,  # 'j'
-        7: 3,  # 'k'
-        6: 3,  # 'l'
-        13: 1,  # 'm'
-        4: 3,  # 'n'
-        8: 3,  # 'o'
-        23: 1,  # 'p'
-        10: 3,  # 'r'
-        5: 3,  # 's'
-        3: 3,  # 't'
-        21: 3,  # 'u'
-        19: 2,  # 'v'
-        62: 0,  # 'x'
-        16: 2,  # 'y'
-        11: 1,  # 'z'
-        51: 0,  # 'Ã'
-        44: 0,  # 'É'
-        61: 0,  # 'Ã'
-        58: 0,  # 'Ó'
-        59: 0,  # 'Ö'
-        60: 0,  # 'Ú'
-        63: 0,  # 'Ü'
-        14: 3,  # 'á'
-        15: 3,  # 'é'
-        30: 3,  # 'í'
-        25: 2,  # 'ó'
-        24: 3,  # 'ö'
-        31: 1,  # 'ú'
-        29: 3,  # 'ü'
-        42: 1,  # 'Å‘'
-        56: 1,  # 'ű'
-    },
-    6: {  # 'l'
-        28: 0,  # 'A'
-        40: 0,  # 'B'
-        54: 0,  # 'C'
-        45: 0,  # 'D'
-        32: 0,  # 'E'
-        50: 0,  # 'F'
-        49: 0,  # 'G'
-        38: 0,  # 'H'
-        39: 0,  # 'I'
-        53: 0,  # 'J'
-        36: 1,  # 'K'
-        41: 0,  # 'L'
-        34: 0,  # 'M'
-        35: 1,  # 'N'
-        47: 0,  # 'O'
-        46: 0,  # 'P'
-        43: 0,  # 'R'
-        33: 0,  # 'S'
-        37: 0,  # 'T'
-        57: 0,  # 'U'
-        48: 0,  # 'V'
-        55: 0,  # 'Y'
-        52: 0,  # 'Z'
-        2: 3,  # 'a'
-        18: 2,  # 'b'
-        26: 3,  # 'c'
-        17: 3,  # 'd'
-        1: 3,  # 'e'
-        27: 3,  # 'f'
-        12: 3,  # 'g'
-        20: 3,  # 'h'
-        9: 3,  # 'i'
-        22: 3,  # 'j'
-        7: 3,  # 'k'
-        6: 3,  # 'l'
-        13: 3,  # 'm'
-        4: 3,  # 'n'
-        8: 3,  # 'o'
-        23: 2,  # 'p'
-        10: 2,  # 'r'
-        5: 3,  # 's'
-        3: 3,  # 't'
-        21: 3,  # 'u'
-        19: 3,  # 'v'
-        62: 0,  # 'x'
-        16: 3,  # 'y'
-        11: 2,  # 'z'
-        51: 0,  # 'Ã'
-        44: 0,  # 'É'
-        61: 0,  # 'Ã'
-        58: 0,  # 'Ó'
-        59: 0,  # 'Ö'
-        60: 0,  # 'Ú'
-        63: 0,  # 'Ü'
-        14: 3,  # 'á'
-        15: 3,  # 'é'
-        30: 3,  # 'í'
-        25: 3,  # 'ó'
-        24: 3,  # 'ö'
-        31: 2,  # 'ú'
-        29: 2,  # 'ü'
-        42: 3,  # 'Å‘'
-        56: 1,  # 'ű'
-    },
-    13: {  # 'm'
-        28: 0,  # 'A'
-        40: 0,  # 'B'
-        54: 0,  # 'C'
-        45: 0,  # 'D'
-        32: 0,  # 'E'
-        50: 0,  # 'F'
-        49: 0,  # 'G'
-        38: 0,  # 'H'
-        39: 0,  # 'I'
-        53: 0,  # 'J'
-        36: 0,  # 'K'
-        41: 0,  # 'L'
-        34: 0,  # 'M'
-        35: 0,  # 'N'
-        47: 0,  # 'O'
-        46: 0,  # 'P'
-        43: 0,  # 'R'
-        33: 0,  # 'S'
-        37: 0,  # 'T'
-        57: 0,  # 'U'
-        48: 0,  # 'V'
-        55: 0,  # 'Y'
-        52: 0,  # 'Z'
-        2: 3,  # 'a'
-        18: 3,  # 'b'
-        26: 2,  # 'c'
-        17: 1,  # 'd'
-        1: 3,  # 'e'
-        27: 1,  # 'f'
-        12: 1,  # 'g'
-        20: 2,  # 'h'
-        9: 3,  # 'i'
-        22: 2,  # 'j'
-        7: 1,  # 'k'
-        6: 3,  # 'l'
-        13: 3,  # 'm'
-        4: 2,  # 'n'
-        8: 3,  # 'o'
-        23: 3,  # 'p'
-        10: 2,  # 'r'
-        5: 2,  # 's'
-        3: 2,  # 't'
-        21: 3,  # 'u'
-        19: 1,  # 'v'
-        62: 0,  # 'x'
-        16: 1,  # 'y'
-        11: 2,  # 'z'
-        51: 0,  # 'Ã'
-        44: 0,  # 'É'
-        61: 0,  # 'Ã'
-        58: 0,  # 'Ó'
-        59: 0,  # 'Ö'
-        60: 0,  # 'Ú'
-        63: 0,  # 'Ü'
-        14: 3,  # 'á'
-        15: 3,  # 'é'
-        30: 2,  # 'í'
-        25: 2,  # 'ó'
-        24: 2,  # 'ö'
-        31: 2,  # 'ú'
-        29: 2,  # 'ü'
-        42: 1,  # 'Å‘'
-        56: 2,  # 'ű'
-    },
-    4: {  # 'n'
-        28: 0,  # 'A'
-        40: 0,  # 'B'
-        54: 0,  # 'C'
-        45: 0,  # 'D'
-        32: 0,  # 'E'
-        50: 0,  # 'F'
-        49: 0,  # 'G'
-        38: 0,  # 'H'
-        39: 0,  # 'I'
-        53: 0,  # 'J'
-        36: 0,  # 'K'
-        41: 0,  # 'L'
-        34: 0,  # 'M'
-        35: 0,  # 'N'
-        47: 0,  # 'O'
-        46: 0,  # 'P'
-        43: 0,  # 'R'
-        33: 0,  # 'S'
-        37: 0,  # 'T'
-        57: 0,  # 'U'
-        48: 0,  # 'V'
-        55: 0,  # 'Y'
-        52: 0,  # 'Z'
-        2: 3,  # 'a'
-        18: 3,  # 'b'
-        26: 3,  # 'c'
-        17: 3,  # 'd'
-        1: 3,  # 'e'
-        27: 2,  # 'f'
-        12: 3,  # 'g'
-        20: 3,  # 'h'
-        9: 3,  # 'i'
-        22: 2,  # 'j'
-        7: 3,  # 'k'
-        6: 2,  # 'l'
-        13: 2,  # 'm'
-        4: 3,  # 'n'
-        8: 3,  # 'o'
-        23: 2,  # 'p'
-        10: 2,  # 'r'
-        5: 3,  # 's'
-        3: 3,  # 't'
-        21: 3,  # 'u'
-        19: 2,  # 'v'
-        62: 1,  # 'x'
-        16: 3,  # 'y'
-        11: 3,  # 'z'
-        51: 0,  # 'Ã'
-        44: 0,  # 'É'
-        61: 0,  # 'Ã'
-        58: 0,  # 'Ó'
-        59: 0,  # 'Ö'
-        60: 0,  # 'Ú'
-        63: 0,  # 'Ü'
-        14: 3,  # 'á'
-        15: 3,  # 'é'
-        30: 2,  # 'í'
-        25: 2,  # 'ó'
-        24: 3,  # 'ö'
-        31: 2,  # 'ú'
-        29: 3,  # 'ü'
-        42: 2,  # 'Å‘'
-        56: 1,  # 'ű'
-    },
-    8: {  # 'o'
-        28: 0,  # 'A'
-        40: 0,  # 'B'
-        54: 0,  # 'C'
-        45: 0,  # 'D'
-        32: 0,  # 'E'
-        50: 0,  # 'F'
-        49: 0,  # 'G'
-        38: 0,  # 'H'
-        39: 0,  # 'I'
-        53: 0,  # 'J'
-        36: 0,  # 'K'
-        41: 0,  # 'L'
-        34: 0,  # 'M'
-        35: 0,  # 'N'
-        47: 1,  # 'O'
-        46: 0,  # 'P'
-        43: 0,  # 'R'
-        33: 0,  # 'S'
-        37: 0,  # 'T'
-        57: 0,  # 'U'
-        48: 0,  # 'V'
-        55: 0,  # 'Y'
-        52: 0,  # 'Z'
-        2: 2,  # 'a'
-        18: 3,  # 'b'
-        26: 3,  # 'c'
-        17: 3,  # 'd'
-        1: 2,  # 'e'
-        27: 2,  # 'f'
-        12: 3,  # 'g'
-        20: 3,  # 'h'
-        9: 2,  # 'i'
-        22: 2,  # 'j'
-        7: 3,  # 'k'
-        6: 3,  # 'l'
-        13: 3,  # 'm'
-        4: 3,  # 'n'
-        8: 1,  # 'o'
-        23: 3,  # 'p'
-        10: 3,  # 'r'
-        5: 3,  # 's'
-        3: 3,  # 't'
-        21: 2,  # 'u'
-        19: 3,  # 'v'
-        62: 1,  # 'x'
-        16: 1,  # 'y'
-        11: 3,  # 'z'
-        51: 0,  # 'Ã'
-        44: 0,  # 'É'
-        61: 0,  # 'Ã'
-        58: 0,  # 'Ó'
-        59: 0,  # 'Ö'
-        60: 0,  # 'Ú'
-        63: 0,  # 'Ü'
-        14: 1,  # 'á'
-        15: 2,  # 'é'
-        30: 1,  # 'í'
-        25: 1,  # 'ó'
-        24: 1,  # 'ö'
-        31: 1,  # 'ú'
-        29: 1,  # 'ü'
-        42: 0,  # 'Å‘'
-        56: 0,  # 'ű'
-    },
-    23: {  # 'p'
-        28: 0,  # 'A'
-        40: 0,  # 'B'
-        54: 0,  # 'C'
-        45: 0,  # 'D'
-        32: 0,  # 'E'
-        50: 0,  # 'F'
-        49: 0,  # 'G'
-        38: 0,  # 'H'
-        39: 0,  # 'I'
-        53: 0,  # 'J'
-        36: 0,  # 'K'
-        41: 0,  # 'L'
-        34: 0,  # 'M'
-        35: 0,  # 'N'
-        47: 0,  # 'O'
-        46: 0,  # 'P'
-        43: 0,  # 'R'
-        33: 0,  # 'S'
-        37: 0,  # 'T'
-        57: 0,  # 'U'
-        48: 0,  # 'V'
-        55: 0,  # 'Y'
-        52: 0,  # 'Z'
-        2: 3,  # 'a'
-        18: 1,  # 'b'
-        26: 2,  # 'c'
-        17: 1,  # 'd'
-        1: 3,  # 'e'
-        27: 1,  # 'f'
-        12: 1,  # 'g'
-        20: 2,  # 'h'
-        9: 3,  # 'i'
-        22: 2,  # 'j'
-        7: 2,  # 'k'
-        6: 3,  # 'l'
-        13: 1,  # 'm'
-        4: 2,  # 'n'
-        8: 3,  # 'o'
-        23: 3,  # 'p'
-        10: 3,  # 'r'
-        5: 2,  # 's'
-        3: 2,  # 't'
-        21: 3,  # 'u'
-        19: 2,  # 'v'
-        62: 0,  # 'x'
-        16: 1,  # 'y'
-        11: 2,  # 'z'
-        51: 0,  # 'Ã'
-        44: 0,  # 'É'
-        61: 0,  # 'Ã'
-        58: 0,  # 'Ó'
-        59: 0,  # 'Ö'
-        60: 0,  # 'Ú'
-        63: 0,  # 'Ü'
-        14: 3,  # 'á'
-        15: 3,  # 'é'
-        30: 2,  # 'í'
-        25: 2,  # 'ó'
-        24: 2,  # 'ö'
-        31: 1,  # 'ú'
-        29: 2,  # 'ü'
-        42: 1,  # 'Å‘'
-        56: 1,  # 'ű'
-    },
-    10: {  # 'r'
-        28: 0,  # 'A'
-        40: 0,  # 'B'
-        54: 0,  # 'C'
-        45: 0,  # 'D'
-        32: 0,  # 'E'
-        50: 0,  # 'F'
-        49: 0,  # 'G'
-        38: 0,  # 'H'
-        39: 0,  # 'I'
-        53: 0,  # 'J'
-        36: 0,  # 'K'
-        41: 0,  # 'L'
-        34: 0,  # 'M'
-        35: 0,  # 'N'
-        47: 0,  # 'O'
-        46: 0,  # 'P'
-        43: 0,  # 'R'
-        33: 0,  # 'S'
-        37: 0,  # 'T'
-        57: 0,  # 'U'
-        48: 0,  # 'V'
-        55: 0,  # 'Y'
-        52: 0,  # 'Z'
-        2: 3,  # 'a'
-        18: 3,  # 'b'
-        26: 3,  # 'c'
-        17: 3,  # 'd'
-        1: 3,  # 'e'
-        27: 2,  # 'f'
-        12: 3,  # 'g'
-        20: 2,  # 'h'
-        9: 3,  # 'i'
-        22: 3,  # 'j'
-        7: 3,  # 'k'
-        6: 3,  # 'l'
-        13: 3,  # 'm'
-        4: 3,  # 'n'
-        8: 3,  # 'o'
-        23: 2,  # 'p'
-        10: 3,  # 'r'
-        5: 3,  # 's'
-        3: 3,  # 't'
-        21: 3,  # 'u'
-        19: 3,  # 'v'
-        62: 1,  # 'x'
-        16: 2,  # 'y'
-        11: 3,  # 'z'
-        51: 0,  # 'Ã'
-        44: 0,  # 'É'
-        61: 0,  # 'Ã'
-        58: 0,  # 'Ó'
-        59: 0,  # 'Ö'
-        60: 0,  # 'Ú'
-        63: 0,  # 'Ü'
-        14: 3,  # 'á'
-        15: 3,  # 'é'
-        30: 2,  # 'í'
-        25: 3,  # 'ó'
-        24: 3,  # 'ö'
-        31: 3,  # 'ú'
-        29: 3,  # 'ü'
-        42: 2,  # 'Å‘'
-        56: 2,  # 'ű'
-    },
-    5: {  # 's'
-        28: 0,  # 'A'
-        40: 0,  # 'B'
-        54: 0,  # 'C'
-        45: 0,  # 'D'
-        32: 0,  # 'E'
-        50: 0,  # 'F'
-        49: 0,  # 'G'
-        38: 0,  # 'H'
-        39: 0,  # 'I'
-        53: 0,  # 'J'
-        36: 0,  # 'K'
-        41: 0,  # 'L'
-        34: 0,  # 'M'
-        35: 0,  # 'N'
-        47: 0,  # 'O'
-        46: 0,  # 'P'
-        43: 0,  # 'R'
-        33: 0,  # 'S'
-        37: 0,  # 'T'
-        57: 0,  # 'U'
-        48: 0,  # 'V'
-        55: 0,  # 'Y'
-        52: 0,  # 'Z'
-        2: 3,  # 'a'
-        18: 3,  # 'b'
-        26: 2,  # 'c'
-        17: 2,  # 'd'
-        1: 3,  # 'e'
-        27: 2,  # 'f'
-        12: 2,  # 'g'
-        20: 2,  # 'h'
-        9: 3,  # 'i'
-        22: 1,  # 'j'
-        7: 3,  # 'k'
-        6: 2,  # 'l'
-        13: 3,  # 'm'
-        4: 3,  # 'n'
-        8: 3,  # 'o'
-        23: 2,  # 'p'
-        10: 3,  # 'r'
-        5: 3,  # 's'
-        3: 3,  # 't'
-        21: 3,  # 'u'
-        19: 2,  # 'v'
-        62: 0,  # 'x'
-        16: 1,  # 'y'
-        11: 3,  # 'z'
-        51: 0,  # 'Ã'
-        44: 0,  # 'É'
-        61: 0,  # 'Ã'
-        58: 0,  # 'Ó'
-        59: 0,  # 'Ö'
-        60: 0,  # 'Ú'
-        63: 0,  # 'Ü'
-        14: 3,  # 'á'
-        15: 3,  # 'é'
-        30: 3,  # 'í'
-        25: 3,  # 'ó'
-        24: 3,  # 'ö'
-        31: 3,  # 'ú'
-        29: 3,  # 'ü'
-        42: 2,  # 'Å‘'
-        56: 1,  # 'ű'
-    },
-    3: {  # 't'
-        28: 0,  # 'A'
-        40: 0,  # 'B'
-        54: 0,  # 'C'
-        45: 0,  # 'D'
-        32: 0,  # 'E'
-        50: 0,  # 'F'
-        49: 0,  # 'G'
-        38: 0,  # 'H'
-        39: 0,  # 'I'
-        53: 0,  # 'J'
-        36: 0,  # 'K'
-        41: 0,  # 'L'
-        34: 0,  # 'M'
-        35: 0,  # 'N'
-        47: 0,  # 'O'
-        46: 0,  # 'P'
-        43: 0,  # 'R'
-        33: 0,  # 'S'
-        37: 0,  # 'T'
-        57: 0,  # 'U'
-        48: 0,  # 'V'
-        55: 0,  # 'Y'
-        52: 0,  # 'Z'
-        2: 3,  # 'a'
-        18: 3,  # 'b'
-        26: 2,  # 'c'
-        17: 1,  # 'd'
-        1: 3,  # 'e'
-        27: 2,  # 'f'
-        12: 1,  # 'g'
-        20: 3,  # 'h'
-        9: 3,  # 'i'
-        22: 3,  # 'j'
-        7: 3,  # 'k'
-        6: 3,  # 'l'
-        13: 2,  # 'm'
-        4: 3,  # 'n'
-        8: 3,  # 'o'
-        23: 1,  # 'p'
-        10: 3,  # 'r'
-        5: 3,  # 's'
-        3: 3,  # 't'
-        21: 3,  # 'u'
-        19: 3,  # 'v'
-        62: 0,  # 'x'
-        16: 3,  # 'y'
-        11: 1,  # 'z'
-        51: 0,  # 'Ã'
-        44: 0,  # 'É'
-        61: 0,  # 'Ã'
-        58: 0,  # 'Ó'
-        59: 0,  # 'Ö'
-        60: 0,  # 'Ú'
-        63: 0,  # 'Ü'
-        14: 3,  # 'á'
-        15: 3,  # 'é'
-        30: 2,  # 'í'
-        25: 3,  # 'ó'
-        24: 3,  # 'ö'
-        31: 3,  # 'ú'
-        29: 3,  # 'ü'
-        42: 3,  # 'Å‘'
-        56: 2,  # 'ű'
-    },
-    21: {  # 'u'
-        28: 0,  # 'A'
-        40: 0,  # 'B'
-        54: 0,  # 'C'
-        45: 0,  # 'D'
-        32: 0,  # 'E'
-        50: 0,  # 'F'
-        49: 0,  # 'G'
-        38: 0,  # 'H'
-        39: 0,  # 'I'
-        53: 0,  # 'J'
-        36: 0,  # 'K'
-        41: 0,  # 'L'
-        34: 0,  # 'M'
-        35: 0,  # 'N'
-        47: 0,  # 'O'
-        46: 0,  # 'P'
-        43: 0,  # 'R'
-        33: 0,  # 'S'
-        37: 0,  # 'T'
-        57: 0,  # 'U'
-        48: 0,  # 'V'
-        55: 0,  # 'Y'
-        52: 0,  # 'Z'
-        2: 1,  # 'a'
-        18: 2,  # 'b'
-        26: 2,  # 'c'
-        17: 3,  # 'd'
-        1: 2,  # 'e'
-        27: 1,  # 'f'
-        12: 3,  # 'g'
-        20: 2,  # 'h'
-        9: 2,  # 'i'
-        22: 2,  # 'j'
-        7: 3,  # 'k'
-        6: 3,  # 'l'
-        13: 3,  # 'm'
-        4: 3,  # 'n'
-        8: 1,  # 'o'
-        23: 2,  # 'p'
-        10: 3,  # 'r'
-        5: 3,  # 's'
-        3: 3,  # 't'
-        21: 1,  # 'u'
-        19: 3,  # 'v'
-        62: 1,  # 'x'
-        16: 1,  # 'y'
-        11: 2,  # 'z'
-        51: 0,  # 'Ã'
-        44: 0,  # 'É'
-        61: 0,  # 'Ã'
-        58: 0,  # 'Ó'
-        59: 0,  # 'Ö'
-        60: 0,  # 'Ú'
-        63: 0,  # 'Ü'
-        14: 2,  # 'á'
-        15: 1,  # 'é'
-        30: 1,  # 'í'
-        25: 1,  # 'ó'
-        24: 0,  # 'ö'
-        31: 1,  # 'ú'
-        29: 0,  # 'ü'
-        42: 0,  # 'Å‘'
-        56: 0,  # 'ű'
-    },
-    19: {  # 'v'
-        28: 0,  # 'A'
-        40: 0,  # 'B'
-        54: 0,  # 'C'
-        45: 0,  # 'D'
-        32: 0,  # 'E'
-        50: 0,  # 'F'
-        49: 0,  # 'G'
-        38: 0,  # 'H'
-        39: 0,  # 'I'
-        53: 0,  # 'J'
-        36: 0,  # 'K'
-        41: 0,  # 'L'
-        34: 0,  # 'M'
-        35: 0,  # 'N'
-        47: 0,  # 'O'
-        46: 0,  # 'P'
-        43: 0,  # 'R'
-        33: 0,  # 'S'
-        37: 0,  # 'T'
-        57: 0,  # 'U'
-        48: 0,  # 'V'
-        55: 0,  # 'Y'
-        52: 0,  # 'Z'
-        2: 3,  # 'a'
-        18: 2,  # 'b'
-        26: 1,  # 'c'
-        17: 1,  # 'd'
-        1: 3,  # 'e'
-        27: 1,  # 'f'
-        12: 1,  # 'g'
-        20: 1,  # 'h'
-        9: 3,  # 'i'
-        22: 1,  # 'j'
-        7: 1,  # 'k'
-        6: 1,  # 'l'
-        13: 1,  # 'm'
-        4: 1,  # 'n'
-        8: 3,  # 'o'
-        23: 1,  # 'p'
-        10: 1,  # 'r'
-        5: 2,  # 's'
-        3: 2,  # 't'
-        21: 2,  # 'u'
-        19: 2,  # 'v'
-        62: 0,  # 'x'
-        16: 1,  # 'y'
-        11: 1,  # 'z'
-        51: 0,  # 'Ã'
-        44: 0,  # 'É'
-        61: 0,  # 'Ã'
-        58: 0,  # 'Ó'
-        59: 0,  # 'Ö'
-        60: 0,  # 'Ú'
-        63: 0,  # 'Ü'
-        14: 3,  # 'á'
-        15: 3,  # 'é'
-        30: 2,  # 'í'
-        25: 2,  # 'ó'
-        24: 2,  # 'ö'
-        31: 1,  # 'ú'
-        29: 2,  # 'ü'
-        42: 1,  # 'Å‘'
-        56: 1,  # 'ű'
-    },
-    62: {  # 'x'
-        28: 0,  # 'A'
-        40: 0,  # 'B'
-        54: 0,  # 'C'
-        45: 0,  # 'D'
-        32: 0,  # 'E'
-        50: 0,  # 'F'
-        49: 0,  # 'G'
-        38: 0,  # 'H'
-        39: 0,  # 'I'
-        53: 0,  # 'J'
-        36: 0,  # 'K'
-        41: 0,  # 'L'
-        34: 0,  # 'M'
-        35: 0,  # 'N'
-        47: 0,  # 'O'
-        46: 0,  # 'P'
-        43: 0,  # 'R'
-        33: 0,  # 'S'
-        37: 0,  # 'T'
-        57: 0,  # 'U'
-        48: 0,  # 'V'
-        55: 0,  # 'Y'
-        52: 0,  # 'Z'
-        2: 1,  # 'a'
-        18: 1,  # 'b'
-        26: 1,  # 'c'
-        17: 0,  # 'd'
-        1: 1,  # 'e'
-        27: 1,  # 'f'
-        12: 0,  # 'g'
-        20: 0,  # 'h'
-        9: 1,  # 'i'
-        22: 0,  # 'j'
-        7: 1,  # 'k'
-        6: 1,  # 'l'
-        13: 1,  # 'm'
-        4: 1,  # 'n'
-        8: 1,  # 'o'
-        23: 1,  # 'p'
-        10: 1,  # 'r'
-        5: 1,  # 's'
-        3: 1,  # 't'
-        21: 1,  # 'u'
-        19: 0,  # 'v'
-        62: 0,  # 'x'
-        16: 0,  # 'y'
-        11: 0,  # 'z'
-        51: 0,  # 'Ã'
-        44: 0,  # 'É'
-        61: 0,  # 'Ã'
-        58: 0,  # 'Ó'
-        59: 0,  # 'Ö'
-        60: 0,  # 'Ú'
-        63: 0,  # 'Ü'
-        14: 1,  # 'á'
-        15: 1,  # 'é'
-        30: 1,  # 'í'
-        25: 1,  # 'ó'
-        24: 0,  # 'ö'
-        31: 0,  # 'ú'
-        29: 0,  # 'ü'
-        42: 0,  # 'Å‘'
-        56: 0,  # 'ű'
-    },
-    16: {  # 'y'
-        28: 0,  # 'A'
-        40: 0,  # 'B'
-        54: 0,  # 'C'
-        45: 0,  # 'D'
-        32: 0,  # 'E'
-        50: 0,  # 'F'
-        49: 0,  # 'G'
-        38: 0,  # 'H'
-        39: 0,  # 'I'
-        53: 0,  # 'J'
-        36: 0,  # 'K'
-        41: 0,  # 'L'
-        34: 0,  # 'M'
-        35: 0,  # 'N'
-        47: 0,  # 'O'
-        46: 0,  # 'P'
-        43: 0,  # 'R'
-        33: 0,  # 'S'
-        37: 0,  # 'T'
-        57: 0,  # 'U'
-        48: 0,  # 'V'
-        55: 0,  # 'Y'
-        52: 0,  # 'Z'
-        2: 3,  # 'a'
-        18: 2,  # 'b'
-        26: 1,  # 'c'
-        17: 1,  # 'd'
-        1: 3,  # 'e'
-        27: 2,  # 'f'
-        12: 2,  # 'g'
-        20: 2,  # 'h'
-        9: 3,  # 'i'
-        22: 2,  # 'j'
-        7: 2,  # 'k'
-        6: 2,  # 'l'
-        13: 2,  # 'm'
-        4: 3,  # 'n'
-        8: 3,  # 'o'
-        23: 2,  # 'p'
-        10: 2,  # 'r'
-        5: 3,  # 's'
-        3: 3,  # 't'
-        21: 3,  # 'u'
-        19: 3,  # 'v'
-        62: 0,  # 'x'
-        16: 0,  # 'y'
-        11: 2,  # 'z'
-        51: 0,  # 'Ã'
-        44: 0,  # 'É'
-        61: 0,  # 'Ã'
-        58: 0,  # 'Ó'
-        59: 0,  # 'Ö'
-        60: 0,  # 'Ú'
-        63: 0,  # 'Ü'
-        14: 3,  # 'á'
-        15: 3,  # 'é'
-        30: 2,  # 'í'
-        25: 2,  # 'ó'
-        24: 3,  # 'ö'
-        31: 2,  # 'ú'
-        29: 2,  # 'ü'
-        42: 1,  # 'Å‘'
-        56: 2,  # 'ű'
-    },
-    11: {  # 'z'
-        28: 0,  # 'A'
-        40: 0,  # 'B'
-        54: 0,  # 'C'
-        45: 0,  # 'D'
-        32: 0,  # 'E'
-        50: 0,  # 'F'
-        49: 0,  # 'G'
-        38: 0,  # 'H'
-        39: 0,  # 'I'
-        53: 0,  # 'J'
-        36: 0,  # 'K'
-        41: 0,  # 'L'
-        34: 0,  # 'M'
-        35: 0,  # 'N'
-        47: 0,  # 'O'
-        46: 0,  # 'P'
-        43: 0,  # 'R'
-        33: 0,  # 'S'
-        37: 0,  # 'T'
-        57: 0,  # 'U'
-        48: 0,  # 'V'
-        55: 0,  # 'Y'
-        52: 0,  # 'Z'
-        2: 3,  # 'a'
-        18: 2,  # 'b'
-        26: 1,  # 'c'
-        17: 3,  # 'd'
-        1: 3,  # 'e'
-        27: 1,  # 'f'
-        12: 2,  # 'g'
-        20: 2,  # 'h'
-        9: 3,  # 'i'
-        22: 1,  # 'j'
-        7: 3,  # 'k'
-        6: 2,  # 'l'
-        13: 3,  # 'm'
-        4: 3,  # 'n'
-        8: 3,  # 'o'
-        23: 1,  # 'p'
-        10: 2,  # 'r'
-        5: 3,  # 's'
-        3: 3,  # 't'
-        21: 3,  # 'u'
-        19: 2,  # 'v'
-        62: 0,  # 'x'
-        16: 1,  # 'y'
-        11: 3,  # 'z'
-        51: 0,  # 'Ã'
-        44: 0,  # 'É'
-        61: 0,  # 'Ã'
-        58: 0,  # 'Ó'
-        59: 0,  # 'Ö'
-        60: 0,  # 'Ú'
-        63: 0,  # 'Ü'
-        14: 3,  # 'á'
-        15: 3,  # 'é'
-        30: 3,  # 'í'
-        25: 3,  # 'ó'
-        24: 3,  # 'ö'
-        31: 2,  # 'ú'
-        29: 3,  # 'ü'
-        42: 2,  # 'Å‘'
-        56: 1,  # 'ű'
-    },
-    51: {  # 'Ã'
-        28: 0,  # 'A'
-        40: 1,  # 'B'
-        54: 1,  # 'C'
-        45: 1,  # 'D'
-        32: 0,  # 'E'
-        50: 1,  # 'F'
-        49: 2,  # 'G'
-        38: 1,  # 'H'
-        39: 1,  # 'I'
-        53: 1,  # 'J'
-        36: 1,  # 'K'
-        41: 2,  # 'L'
-        34: 1,  # 'M'
-        35: 2,  # 'N'
-        47: 0,  # 'O'
-        46: 1,  # 'P'
-        43: 2,  # 'R'
-        33: 2,  # 'S'
-        37: 1,  # 'T'
-        57: 0,  # 'U'
-        48: 1,  # 'V'
-        55: 0,  # 'Y'
-        52: 1,  # 'Z'
-        2: 0,  # 'a'
-        18: 1,  # 'b'
-        26: 1,  # 'c'
-        17: 1,  # 'd'
-        1: 0,  # 'e'
-        27: 0,  # 'f'
-        12: 1,  # 'g'
-        20: 1,  # 'h'
-        9: 0,  # 'i'
-        22: 1,  # 'j'
-        7: 1,  # 'k'
-        6: 2,  # 'l'
-        13: 2,  # 'm'
-        4: 0,  # 'n'
-        8: 0,  # 'o'
-        23: 1,  # 'p'
-        10: 1,  # 'r'
-        5: 1,  # 's'
-        3: 1,  # 't'
-        21: 0,  # 'u'
-        19: 0,  # 'v'
-        62: 0,  # 'x'
-        16: 0,  # 'y'
-        11: 1,  # 'z'
-        51: 0,  # 'Ã'
-        44: 0,  # 'É'
-        61: 1,  # 'Ã'
-        58: 0,  # 'Ó'
-        59: 0,  # 'Ö'
-        60: 0,  # 'Ú'
-        63: 0,  # 'Ü'
-        14: 0,  # 'á'
-        15: 0,  # 'é'
-        30: 0,  # 'í'
-        25: 0,  # 'ó'
-        24: 0,  # 'ö'
-        31: 0,  # 'ú'
-        29: 0,  # 'ü'
-        42: 0,  # 'Å‘'
-        56: 0,  # 'ű'
-    },
-    44: {  # 'É'
-        28: 0,  # 'A'
-        40: 1,  # 'B'
-        54: 1,  # 'C'
-        45: 1,  # 'D'
-        32: 1,  # 'E'
-        50: 0,  # 'F'
-        49: 2,  # 'G'
-        38: 1,  # 'H'
-        39: 1,  # 'I'
-        53: 1,  # 'J'
-        36: 1,  # 'K'
-        41: 2,  # 'L'
-        34: 1,  # 'M'
-        35: 2,  # 'N'
-        47: 0,  # 'O'
-        46: 1,  # 'P'
-        43: 2,  # 'R'
-        33: 2,  # 'S'
-        37: 2,  # 'T'
-        57: 0,  # 'U'
-        48: 1,  # 'V'
-        55: 0,  # 'Y'
-        52: 1,  # 'Z'
-        2: 0,  # 'a'
-        18: 1,  # 'b'
-        26: 1,  # 'c'
-        17: 1,  # 'd'
-        1: 0,  # 'e'
-        27: 0,  # 'f'
-        12: 1,  # 'g'
-        20: 1,  # 'h'
-        9: 0,  # 'i'
-        22: 1,  # 'j'
-        7: 1,  # 'k'
-        6: 2,  # 'l'
-        13: 1,  # 'm'
-        4: 2,  # 'n'
-        8: 0,  # 'o'
-        23: 1,  # 'p'
-        10: 2,  # 'r'
-        5: 3,  # 's'
-        3: 1,  # 't'
-        21: 0,  # 'u'
-        19: 1,  # 'v'
-        62: 0,  # 'x'
-        16: 0,  # 'y'
-        11: 0,  # 'z'
-        51: 0,  # 'Ã'
-        44: 1,  # 'É'
-        61: 0,  # 'Ã'
-        58: 0,  # 'Ó'
-        59: 0,  # 'Ö'
-        60: 0,  # 'Ú'
-        63: 0,  # 'Ü'
-        14: 0,  # 'á'
-        15: 0,  # 'é'
-        30: 0,  # 'í'
-        25: 0,  # 'ó'
-        24: 0,  # 'ö'
-        31: 0,  # 'ú'
-        29: 0,  # 'ü'
-        42: 0,  # 'Å‘'
-        56: 0,  # 'ű'
-    },
-    61: {  # 'Ã'
-        28: 0,  # 'A'
-        40: 1,  # 'B'
-        54: 1,  # 'C'
-        45: 1,  # 'D'
-        32: 0,  # 'E'
-        50: 1,  # 'F'
-        49: 1,  # 'G'
-        38: 0,  # 'H'
-        39: 0,  # 'I'
-        53: 1,  # 'J'
-        36: 0,  # 'K'
-        41: 1,  # 'L'
-        34: 1,  # 'M'
-        35: 1,  # 'N'
-        47: 0,  # 'O'
-        46: 1,  # 'P'
-        43: 1,  # 'R'
-        33: 1,  # 'S'
-        37: 1,  # 'T'
-        57: 0,  # 'U'
-        48: 1,  # 'V'
-        55: 0,  # 'Y'
-        52: 1,  # 'Z'
-        2: 0,  # 'a'
-        18: 0,  # 'b'
-        26: 0,  # 'c'
-        17: 0,  # 'd'
-        1: 0,  # 'e'
-        27: 0,  # 'f'
-        12: 2,  # 'g'
-        20: 0,  # 'h'
-        9: 0,  # 'i'
-        22: 0,  # 'j'
-        7: 0,  # 'k'
-        6: 0,  # 'l'
-        13: 1,  # 'm'
-        4: 0,  # 'n'
-        8: 0,  # 'o'
-        23: 0,  # 'p'
-        10: 1,  # 'r'
-        5: 0,  # 's'
-        3: 1,  # 't'
-        21: 0,  # 'u'
-        19: 0,  # 'v'
-        62: 0,  # 'x'
-        16: 0,  # 'y'
-        11: 1,  # 'z'
-        51: 0,  # 'Ã'
-        44: 0,  # 'É'
-        61: 0,  # 'Ã'
-        58: 0,  # 'Ó'
-        59: 0,  # 'Ö'
-        60: 0,  # 'Ú'
-        63: 0,  # 'Ü'
-        14: 0,  # 'á'
-        15: 0,  # 'é'
-        30: 0,  # 'í'
-        25: 0,  # 'ó'
-        24: 0,  # 'ö'
-        31: 0,  # 'ú'
-        29: 0,  # 'ü'
-        42: 0,  # 'Å‘'
-        56: 0,  # 'ű'
-    },
-    58: {  # 'Ó'
-        28: 1,  # 'A'
-        40: 1,  # 'B'
-        54: 1,  # 'C'
-        45: 1,  # 'D'
-        32: 0,  # 'E'
-        50: 1,  # 'F'
-        49: 1,  # 'G'
-        38: 1,  # 'H'
-        39: 1,  # 'I'
-        53: 1,  # 'J'
-        36: 1,  # 'K'
-        41: 2,  # 'L'
-        34: 1,  # 'M'
-        35: 1,  # 'N'
-        47: 0,  # 'O'
-        46: 1,  # 'P'
-        43: 1,  # 'R'
-        33: 1,  # 'S'
-        37: 1,  # 'T'
-        57: 0,  # 'U'
-        48: 1,  # 'V'
-        55: 0,  # 'Y'
-        52: 1,  # 'Z'
-        2: 0,  # 'a'
-        18: 1,  # 'b'
-        26: 1,  # 'c'
-        17: 1,  # 'd'
-        1: 0,  # 'e'
-        27: 0,  # 'f'
-        12: 0,  # 'g'
-        20: 2,  # 'h'
-        9: 0,  # 'i'
-        22: 0,  # 'j'
-        7: 1,  # 'k'
-        6: 1,  # 'l'
-        13: 0,  # 'm'
-        4: 1,  # 'n'
-        8: 0,  # 'o'
-        23: 1,  # 'p'
-        10: 1,  # 'r'
-        5: 1,  # 's'
-        3: 0,  # 't'
-        21: 0,  # 'u'
-        19: 1,  # 'v'
-        62: 0,  # 'x'
-        16: 0,  # 'y'
-        11: 1,  # 'z'
-        51: 0,  # 'Ã'
-        44: 1,  # 'É'
-        61: 0,  # 'Ã'
-        58: 0,  # 'Ó'
-        59: 0,  # 'Ö'
-        60: 0,  # 'Ú'
-        63: 0,  # 'Ü'
-        14: 0,  # 'á'
-        15: 0,  # 'é'
-        30: 0,  # 'í'
-        25: 0,  # 'ó'
-        24: 0,  # 'ö'
-        31: 0,  # 'ú'
-        29: 0,  # 'ü'
-        42: 0,  # 'Å‘'
-        56: 0,  # 'ű'
-    },
-    59: {  # 'Ö'
-        28: 0,  # 'A'
-        40: 1,  # 'B'
-        54: 1,  # 'C'
-        45: 1,  # 'D'
-        32: 0,  # 'E'
-        50: 0,  # 'F'
-        49: 1,  # 'G'
-        38: 1,  # 'H'
-        39: 0,  # 'I'
-        53: 1,  # 'J'
-        36: 1,  # 'K'
-        41: 1,  # 'L'
-        34: 1,  # 'M'
-        35: 1,  # 'N'
-        47: 0,  # 'O'
-        46: 1,  # 'P'
-        43: 1,  # 'R'
-        33: 1,  # 'S'
-        37: 1,  # 'T'
-        57: 0,  # 'U'
-        48: 1,  # 'V'
-        55: 0,  # 'Y'
-        52: 1,  # 'Z'
-        2: 0,  # 'a'
-        18: 0,  # 'b'
-        26: 1,  # 'c'
-        17: 1,  # 'd'
-        1: 0,  # 'e'
-        27: 0,  # 'f'
-        12: 0,  # 'g'
-        20: 0,  # 'h'
-        9: 0,  # 'i'
-        22: 0,  # 'j'
-        7: 1,  # 'k'
-        6: 1,  # 'l'
-        13: 1,  # 'm'
-        4: 1,  # 'n'
-        8: 0,  # 'o'
-        23: 0,  # 'p'
-        10: 2,  # 'r'
-        5: 1,  # 's'
-        3: 1,  # 't'
-        21: 0,  # 'u'
-        19: 1,  # 'v'
-        62: 0,  # 'x'
-        16: 0,  # 'y'
-        11: 1,  # 'z'
-        51: 0,  # 'Ã'
-        44: 0,  # 'É'
-        61: 0,  # 'Ã'
-        58: 0,  # 'Ó'
-        59: 0,  # 'Ö'
-        60: 0,  # 'Ú'
-        63: 0,  # 'Ü'
-        14: 0,  # 'á'
-        15: 0,  # 'é'
-        30: 0,  # 'í'
-        25: 0,  # 'ó'
-        24: 0,  # 'ö'
-        31: 0,  # 'ú'
-        29: 0,  # 'ü'
-        42: 0,  # 'Å‘'
-        56: 0,  # 'ű'
-    },
-    60: {  # 'Ú'
-        28: 0,  # 'A'
-        40: 1,  # 'B'
-        54: 1,  # 'C'
-        45: 1,  # 'D'
-        32: 0,  # 'E'
-        50: 1,  # 'F'
-        49: 1,  # 'G'
-        38: 0,  # 'H'
-        39: 0,  # 'I'
-        53: 1,  # 'J'
-        36: 1,  # 'K'
-        41: 1,  # 'L'
-        34: 1,  # 'M'
-        35: 1,  # 'N'
-        47: 0,  # 'O'
-        46: 0,  # 'P'
-        43: 1,  # 'R'
-        33: 1,  # 'S'
-        37: 1,  # 'T'
-        57: 0,  # 'U'
-        48: 1,  # 'V'
-        55: 0,  # 'Y'
-        52: 1,  # 'Z'
-        2: 0,  # 'a'
-        18: 0,  # 'b'
-        26: 0,  # 'c'
-        17: 0,  # 'd'
-        1: 0,  # 'e'
-        27: 0,  # 'f'
-        12: 2,  # 'g'
-        20: 0,  # 'h'
-        9: 0,  # 'i'
-        22: 2,  # 'j'
-        7: 0,  # 'k'
-        6: 0,  # 'l'
-        13: 0,  # 'm'
-        4: 1,  # 'n'
-        8: 0,  # 'o'
-        23: 0,  # 'p'
-        10: 1,  # 'r'
-        5: 1,  # 's'
-        3: 1,  # 't'
-        21: 0,  # 'u'
-        19: 0,  # 'v'
-        62: 0,  # 'x'
-        16: 0,  # 'y'
-        11: 0,  # 'z'
-        51: 0,  # 'Ã'
-        44: 0,  # 'É'
-        61: 0,  # 'Ã'
-        58: 0,  # 'Ó'
-        59: 0,  # 'Ö'
-        60: 0,  # 'Ú'
-        63: 0,  # 'Ü'
-        14: 0,  # 'á'
-        15: 0,  # 'é'
-        30: 0,  # 'í'
-        25: 0,  # 'ó'
-        24: 0,  # 'ö'
-        31: 0,  # 'ú'
-        29: 0,  # 'ü'
-        42: 0,  # 'Å‘'
-        56: 0,  # 'ű'
-    },
-    63: {  # 'Ü'
-        28: 0,  # 'A'
-        40: 1,  # 'B'
-        54: 0,  # 'C'
-        45: 1,  # 'D'
-        32: 0,  # 'E'
-        50: 0,  # 'F'
-        49: 1,  # 'G'
-        38: 1,  # 'H'
-        39: 0,  # 'I'
-        53: 1,  # 'J'
-        36: 1,  # 'K'
-        41: 1,  # 'L'
-        34: 1,  # 'M'
-        35: 1,  # 'N'
-        47: 0,  # 'O'
-        46: 0,  # 'P'
-        43: 1,  # 'R'
-        33: 1,  # 'S'
-        37: 1,  # 'T'
-        57: 0,  # 'U'
-        48: 1,  # 'V'
-        55: 0,  # 'Y'
-        52: 1,  # 'Z'
-        2: 0,  # 'a'
-        18: 1,  # 'b'
-        26: 0,  # 'c'
-        17: 1,  # 'd'
-        1: 0,  # 'e'
-        27: 0,  # 'f'
-        12: 1,  # 'g'
-        20: 0,  # 'h'
-        9: 0,  # 'i'
-        22: 0,  # 'j'
-        7: 0,  # 'k'
-        6: 1,  # 'l'
-        13: 0,  # 'm'
-        4: 1,  # 'n'
-        8: 0,  # 'o'
-        23: 0,  # 'p'
-        10: 1,  # 'r'
-        5: 1,  # 's'
-        3: 1,  # 't'
-        21: 0,  # 'u'
-        19: 1,  # 'v'
-        62: 0,  # 'x'
-        16: 0,  # 'y'
-        11: 1,  # 'z'
-        51: 0,  # 'Ã'
-        44: 0,  # 'É'
-        61: 0,  # 'Ã'
-        58: 0,  # 'Ó'
-        59: 0,  # 'Ö'
-        60: 0,  # 'Ú'
-        63: 0,  # 'Ü'
-        14: 0,  # 'á'
-        15: 0,  # 'é'
-        30: 0,  # 'í'
-        25: 0,  # 'ó'
-        24: 0,  # 'ö'
-        31: 0,  # 'ú'
-        29: 0,  # 'ü'
-        42: 0,  # 'Å‘'
-        56: 0,  # 'ű'
-    },
-    14: {  # 'á'
-        28: 0,  # 'A'
-        40: 0,  # 'B'
-        54: 0,  # 'C'
-        45: 0,  # 'D'
-        32: 0,  # 'E'
-        50: 0,  # 'F'
-        49: 0,  # 'G'
-        38: 0,  # 'H'
-        39: 0,  # 'I'
-        53: 0,  # 'J'
-        36: 0,  # 'K'
-        41: 0,  # 'L'
-        34: 0,  # 'M'
-        35: 0,  # 'N'
-        47: 0,  # 'O'
-        46: 0,  # 'P'
-        43: 0,  # 'R'
-        33: 0,  # 'S'
-        37: 0,  # 'T'
-        57: 0,  # 'U'
-        48: 0,  # 'V'
-        55: 0,  # 'Y'
-        52: 0,  # 'Z'
-        2: 1,  # 'a'
-        18: 3,  # 'b'
-        26: 3,  # 'c'
-        17: 3,  # 'd'
-        1: 1,  # 'e'
-        27: 2,  # 'f'
-        12: 3,  # 'g'
-        20: 2,  # 'h'
-        9: 2,  # 'i'
-        22: 3,  # 'j'
-        7: 3,  # 'k'
-        6: 3,  # 'l'
-        13: 3,  # 'm'
-        4: 3,  # 'n'
-        8: 1,  # 'o'
-        23: 2,  # 'p'
-        10: 3,  # 'r'
-        5: 3,  # 's'
-        3: 3,  # 't'
-        21: 2,  # 'u'
-        19: 3,  # 'v'
-        62: 0,  # 'x'
-        16: 1,  # 'y'
-        11: 3,  # 'z'
-        51: 0,  # 'Ã'
-        44: 0,  # 'É'
-        61: 0,  # 'Ã'
-        58: 0,  # 'Ó'
-        59: 0,  # 'Ö'
-        60: 0,  # 'Ú'
-        63: 0,  # 'Ü'
-        14: 1,  # 'á'
-        15: 2,  # 'é'
-        30: 1,  # 'í'
-        25: 0,  # 'ó'
-        24: 1,  # 'ö'
-        31: 0,  # 'ú'
-        29: 1,  # 'ü'
-        42: 0,  # 'Å‘'
-        56: 0,  # 'ű'
-    },
-    15: {  # 'é'
-        28: 0,  # 'A'
-        40: 0,  # 'B'
-        54: 0,  # 'C'
-        45: 0,  # 'D'
-        32: 0,  # 'E'
-        50: 0,  # 'F'
-        49: 0,  # 'G'
-        38: 0,  # 'H'
-        39: 0,  # 'I'
-        53: 0,  # 'J'
-        36: 0,  # 'K'
-        41: 0,  # 'L'
-        34: 0,  # 'M'
-        35: 0,  # 'N'
-        47: 0,  # 'O'
-        46: 0,  # 'P'
-        43: 0,  # 'R'
-        33: 0,  # 'S'
-        37: 0,  # 'T'
-        57: 0,  # 'U'
-        48: 0,  # 'V'
-        55: 0,  # 'Y'
-        52: 0,  # 'Z'
-        2: 1,  # 'a'
-        18: 3,  # 'b'
-        26: 2,  # 'c'
-        17: 3,  # 'd'
-        1: 1,  # 'e'
-        27: 1,  # 'f'
-        12: 3,  # 'g'
-        20: 3,  # 'h'
-        9: 2,  # 'i'
-        22: 2,  # 'j'
-        7: 3,  # 'k'
-        6: 3,  # 'l'
-        13: 3,  # 'm'
-        4: 3,  # 'n'
-        8: 1,  # 'o'
-        23: 3,  # 'p'
-        10: 3,  # 'r'
-        5: 3,  # 's'
-        3: 3,  # 't'
-        21: 0,  # 'u'
-        19: 3,  # 'v'
-        62: 0,  # 'x'
-        16: 0,  # 'y'
-        11: 3,  # 'z'
-        51: 0,  # 'Ã'
-        44: 0,  # 'É'
-        61: 0,  # 'Ã'
-        58: 0,  # 'Ó'
-        59: 0,  # 'Ö'
-        60: 0,  # 'Ú'
-        63: 0,  # 'Ü'
-        14: 1,  # 'á'
-        15: 1,  # 'é'
-        30: 0,  # 'í'
-        25: 0,  # 'ó'
-        24: 0,  # 'ö'
-        31: 0,  # 'ú'
-        29: 1,  # 'ü'
-        42: 0,  # 'Å‘'
-        56: 0,  # 'ű'
-    },
-    30: {  # 'í'
-        28: 0,  # 'A'
-        40: 0,  # 'B'
-        54: 0,  # 'C'
-        45: 0,  # 'D'
-        32: 0,  # 'E'
-        50: 0,  # 'F'
-        49: 0,  # 'G'
-        38: 0,  # 'H'
-        39: 0,  # 'I'
-        53: 0,  # 'J'
-        36: 0,  # 'K'
-        41: 0,  # 'L'
-        34: 0,  # 'M'
-        35: 0,  # 'N'
-        47: 0,  # 'O'
-        46: 0,  # 'P'
-        43: 0,  # 'R'
-        33: 0,  # 'S'
-        37: 0,  # 'T'
-        57: 0,  # 'U'
-        48: 0,  # 'V'
-        55: 0,  # 'Y'
-        52: 0,  # 'Z'
-        2: 0,  # 'a'
-        18: 1,  # 'b'
-        26: 2,  # 'c'
-        17: 1,  # 'd'
-        1: 0,  # 'e'
-        27: 1,  # 'f'
-        12: 3,  # 'g'
-        20: 0,  # 'h'
-        9: 0,  # 'i'
-        22: 1,  # 'j'
-        7: 1,  # 'k'
-        6: 2,  # 'l'
-        13: 2,  # 'm'
-        4: 3,  # 'n'
-        8: 0,  # 'o'
-        23: 1,  # 'p'
-        10: 3,  # 'r'
-        5: 2,  # 's'
-        3: 3,  # 't'
-        21: 0,  # 'u'
-        19: 3,  # 'v'
-        62: 0,  # 'x'
-        16: 0,  # 'y'
-        11: 2,  # 'z'
-        51: 0,  # 'Ã'
-        44: 0,  # 'É'
-        61: 0,  # 'Ã'
-        58: 0,  # 'Ó'
-        59: 0,  # 'Ö'
-        60: 0,  # 'Ú'
-        63: 0,  # 'Ü'
-        14: 0,  # 'á'
-        15: 0,  # 'é'
-        30: 0,  # 'í'
-        25: 0,  # 'ó'
-        24: 0,  # 'ö'
-        31: 0,  # 'ú'
-        29: 0,  # 'ü'
-        42: 0,  # 'Å‘'
-        56: 0,  # 'ű'
-    },
-    25: {  # 'ó'
-        28: 0,  # 'A'
-        40: 0,  # 'B'
-        54: 0,  # 'C'
-        45: 0,  # 'D'
-        32: 0,  # 'E'
-        50: 0,  # 'F'
-        49: 0,  # 'G'
-        38: 0,  # 'H'
-        39: 0,  # 'I'
-        53: 0,  # 'J'
-        36: 0,  # 'K'
-        41: 0,  # 'L'
-        34: 0,  # 'M'
-        35: 0,  # 'N'
-        47: 0,  # 'O'
-        46: 0,  # 'P'
-        43: 0,  # 'R'
-        33: 0,  # 'S'
-        37: 0,  # 'T'
-        57: 0,  # 'U'
-        48: 0,  # 'V'
-        55: 0,  # 'Y'
-        52: 0,  # 'Z'
-        2: 2,  # 'a'
-        18: 3,  # 'b'
-        26: 2,  # 'c'
-        17: 3,  # 'd'
-        1: 1,  # 'e'
-        27: 2,  # 'f'
-        12: 2,  # 'g'
-        20: 2,  # 'h'
-        9: 2,  # 'i'
-        22: 2,  # 'j'
-        7: 3,  # 'k'
-        6: 3,  # 'l'
-        13: 2,  # 'm'
-        4: 3,  # 'n'
-        8: 1,  # 'o'
-        23: 2,  # 'p'
-        10: 3,  # 'r'
-        5: 3,  # 's'
-        3: 3,  # 't'
-        21: 1,  # 'u'
-        19: 2,  # 'v'
-        62: 0,  # 'x'
-        16: 0,  # 'y'
-        11: 3,  # 'z'
-        51: 0,  # 'Ã'
-        44: 0,  # 'É'
-        61: 0,  # 'Ã'
-        58: 0,  # 'Ó'
-        59: 0,  # 'Ö'
-        60: 0,  # 'Ú'
-        63: 0,  # 'Ü'
-        14: 1,  # 'á'
-        15: 1,  # 'é'
-        30: 1,  # 'í'
-        25: 0,  # 'ó'
-        24: 1,  # 'ö'
-        31: 1,  # 'ú'
-        29: 1,  # 'ü'
-        42: 0,  # 'Å‘'
-        56: 0,  # 'ű'
-    },
-    24: {  # 'ö'
-        28: 0,  # 'A'
-        40: 0,  # 'B'
-        54: 0,  # 'C'
-        45: 0,  # 'D'
-        32: 0,  # 'E'
-        50: 0,  # 'F'
-        49: 0,  # 'G'
-        38: 0,  # 'H'
-        39: 0,  # 'I'
-        53: 0,  # 'J'
-        36: 0,  # 'K'
-        41: 0,  # 'L'
-        34: 0,  # 'M'
-        35: 0,  # 'N'
-        47: 0,  # 'O'
-        46: 0,  # 'P'
-        43: 0,  # 'R'
-        33: 0,  # 'S'
-        37: 0,  # 'T'
-        57: 0,  # 'U'
-        48: 0,  # 'V'
-        55: 0,  # 'Y'
-        52: 0,  # 'Z'
-        2: 0,  # 'a'
-        18: 3,  # 'b'
-        26: 1,  # 'c'
-        17: 2,  # 'd'
-        1: 0,  # 'e'
-        27: 1,  # 'f'
-        12: 2,  # 'g'
-        20: 1,  # 'h'
-        9: 0,  # 'i'
-        22: 1,  # 'j'
-        7: 3,  # 'k'
-        6: 3,  # 'l'
-        13: 3,  # 'm'
-        4: 3,  # 'n'
-        8: 0,  # 'o'
-        23: 2,  # 'p'
-        10: 3,  # 'r'
-        5: 3,  # 's'
-        3: 3,  # 't'
-        21: 0,  # 'u'
-        19: 3,  # 'v'
-        62: 0,  # 'x'
-        16: 0,  # 'y'
-        11: 3,  # 'z'
-        51: 0,  # 'Ã'
-        44: 0,  # 'É'
-        61: 0,  # 'Ã'
-        58: 0,  # 'Ó'
-        59: 0,  # 'Ö'
-        60: 0,  # 'Ú'
-        63: 0,  # 'Ü'
-        14: 0,  # 'á'
-        15: 0,  # 'é'
-        30: 0,  # 'í'
-        25: 0,  # 'ó'
-        24: 0,  # 'ö'
-        31: 0,  # 'ú'
-        29: 0,  # 'ü'
-        42: 0,  # 'Å‘'
-        56: 0,  # 'ű'
-    },
-    31: {  # 'ú'
-        28: 0,  # 'A'
-        40: 0,  # 'B'
-        54: 0,  # 'C'
-        45: 0,  # 'D'
-        32: 0,  # 'E'
-        50: 0,  # 'F'
-        49: 0,  # 'G'
-        38: 0,  # 'H'
-        39: 0,  # 'I'
-        53: 0,  # 'J'
-        36: 0,  # 'K'
-        41: 0,  # 'L'
-        34: 0,  # 'M'
-        35: 0,  # 'N'
-        47: 0,  # 'O'
-        46: 0,  # 'P'
-        43: 0,  # 'R'
-        33: 0,  # 'S'
-        37: 0,  # 'T'
-        57: 0,  # 'U'
-        48: 0,  # 'V'
-        55: 0,  # 'Y'
-        52: 0,  # 'Z'
-        2: 1,  # 'a'
-        18: 1,  # 'b'
-        26: 2,  # 'c'
-        17: 1,  # 'd'
-        1: 1,  # 'e'
-        27: 2,  # 'f'
-        12: 3,  # 'g'
-        20: 1,  # 'h'
-        9: 1,  # 'i'
-        22: 3,  # 'j'
-        7: 1,  # 'k'
-        6: 3,  # 'l'
-        13: 1,  # 'm'
-        4: 2,  # 'n'
-        8: 0,  # 'o'
-        23: 1,  # 'p'
-        10: 3,  # 'r'
-        5: 3,  # 's'
-        3: 2,  # 't'
-        21: 1,  # 'u'
-        19: 1,  # 'v'
-        62: 0,  # 'x'
-        16: 0,  # 'y'
-        11: 2,  # 'z'
-        51: 0,  # 'Ã'
-        44: 0,  # 'É'
-        61: 0,  # 'Ã'
-        58: 0,  # 'Ó'
-        59: 0,  # 'Ö'
-        60: 0,  # 'Ú'
-        63: 0,  # 'Ü'
-        14: 1,  # 'á'
-        15: 1,  # 'é'
-        30: 0,  # 'í'
-        25: 0,  # 'ó'
-        24: 0,  # 'ö'
-        31: 0,  # 'ú'
-        29: 0,  # 'ü'
-        42: 0,  # 'Å‘'
-        56: 0,  # 'ű'
-    },
-    29: {  # 'ü'
-        28: 0,  # 'A'
-        40: 0,  # 'B'
-        54: 0,  # 'C'
-        45: 0,  # 'D'
-        32: 0,  # 'E'
-        50: 0,  # 'F'
-        49: 0,  # 'G'
-        38: 0,  # 'H'
-        39: 0,  # 'I'
-        53: 0,  # 'J'
-        36: 0,  # 'K'
-        41: 0,  # 'L'
-        34: 0,  # 'M'
-        35: 0,  # 'N'
-        47: 0,  # 'O'
-        46: 0,  # 'P'
-        43: 0,  # 'R'
-        33: 0,  # 'S'
-        37: 0,  # 'T'
-        57: 0,  # 'U'
-        48: 0,  # 'V'
-        55: 0,  # 'Y'
-        52: 0,  # 'Z'
-        2: 1,  # 'a'
-        18: 1,  # 'b'
-        26: 1,  # 'c'
-        17: 2,  # 'd'
-        1: 1,  # 'e'
-        27: 1,  # 'f'
-        12: 3,  # 'g'
-        20: 2,  # 'h'
-        9: 1,  # 'i'
-        22: 1,  # 'j'
-        7: 3,  # 'k'
-        6: 3,  # 'l'
-        13: 1,  # 'm'
-        4: 3,  # 'n'
-        8: 0,  # 'o'
-        23: 1,  # 'p'
-        10: 2,  # 'r'
-        5: 2,  # 's'
-        3: 2,  # 't'
-        21: 0,  # 'u'
-        19: 2,  # 'v'
-        62: 0,  # 'x'
-        16: 0,  # 'y'
-        11: 2,  # 'z'
-        51: 0,  # 'Ã'
-        44: 0,  # 'É'
-        61: 0,  # 'Ã'
-        58: 0,  # 'Ó'
-        59: 0,  # 'Ö'
-        60: 0,  # 'Ú'
-        63: 0,  # 'Ü'
-        14: 0,  # 'á'
-        15: 1,  # 'é'
-        30: 0,  # 'í'
-        25: 0,  # 'ó'
-        24: 0,  # 'ö'
-        31: 0,  # 'ú'
-        29: 0,  # 'ü'
-        42: 0,  # 'Å‘'
-        56: 0,  # 'ű'
-    },
-    42: {  # 'Å‘'
-        28: 0,  # 'A'
-        40: 0,  # 'B'
-        54: 0,  # 'C'
-        45: 0,  # 'D'
-        32: 0,  # 'E'
-        50: 0,  # 'F'
-        49: 0,  # 'G'
-        38: 0,  # 'H'
-        39: 0,  # 'I'
-        53: 0,  # 'J'
-        36: 0,  # 'K'
-        41: 0,  # 'L'
-        34: 0,  # 'M'
-        35: 0,  # 'N'
-        47: 0,  # 'O'
-        46: 0,  # 'P'
-        43: 0,  # 'R'
-        33: 0,  # 'S'
-        37: 0,  # 'T'
-        57: 0,  # 'U'
-        48: 0,  # 'V'
-        55: 0,  # 'Y'
-        52: 0,  # 'Z'
-        2: 1,  # 'a'
-        18: 2,  # 'b'
-        26: 1,  # 'c'
-        17: 2,  # 'd'
-        1: 1,  # 'e'
-        27: 1,  # 'f'
-        12: 1,  # 'g'
-        20: 1,  # 'h'
-        9: 1,  # 'i'
-        22: 1,  # 'j'
-        7: 2,  # 'k'
-        6: 3,  # 'l'
-        13: 1,  # 'm'
-        4: 2,  # 'n'
-        8: 1,  # 'o'
-        23: 1,  # 'p'
-        10: 2,  # 'r'
-        5: 2,  # 's'
-        3: 2,  # 't'
-        21: 1,  # 'u'
-        19: 1,  # 'v'
-        62: 0,  # 'x'
-        16: 0,  # 'y'
-        11: 2,  # 'z'
-        51: 0,  # 'Ã'
-        44: 0,  # 'É'
-        61: 0,  # 'Ã'
-        58: 0,  # 'Ó'
-        59: 0,  # 'Ö'
-        60: 0,  # 'Ú'
-        63: 0,  # 'Ü'
-        14: 0,  # 'á'
-        15: 1,  # 'é'
-        30: 1,  # 'í'
-        25: 0,  # 'ó'
-        24: 0,  # 'ö'
-        31: 0,  # 'ú'
-        29: 1,  # 'ü'
-        42: 0,  # 'Å‘'
-        56: 0,  # 'ű'
-    },
-    56: {  # 'ű'
-        28: 0,  # 'A'
-        40: 0,  # 'B'
-        54: 0,  # 'C'
-        45: 0,  # 'D'
-        32: 0,  # 'E'
-        50: 0,  # 'F'
-        49: 0,  # 'G'
-        38: 0,  # 'H'
-        39: 0,  # 'I'
-        53: 0,  # 'J'
-        36: 0,  # 'K'
-        41: 0,  # 'L'
-        34: 0,  # 'M'
-        35: 0,  # 'N'
-        47: 0,  # 'O'
-        46: 0,  # 'P'
-        43: 0,  # 'R'
-        33: 0,  # 'S'
-        37: 0,  # 'T'
-        57: 0,  # 'U'
-        48: 0,  # 'V'
-        55: 0,  # 'Y'
-        52: 0,  # 'Z'
-        2: 1,  # 'a'
-        18: 1,  # 'b'
-        26: 0,  # 'c'
-        17: 1,  # 'd'
-        1: 1,  # 'e'
-        27: 1,  # 'f'
-        12: 1,  # 'g'
-        20: 1,  # 'h'
-        9: 1,  # 'i'
-        22: 1,  # 'j'
-        7: 1,  # 'k'
-        6: 1,  # 'l'
-        13: 0,  # 'm'
-        4: 2,  # 'n'
-        8: 0,  # 'o'
-        23: 0,  # 'p'
-        10: 1,  # 'r'
-        5: 1,  # 's'
-        3: 1,  # 't'
-        21: 0,  # 'u'
-        19: 1,  # 'v'
-        62: 0,  # 'x'
-        16: 0,  # 'y'
-        11: 2,  # 'z'
-        51: 0,  # 'Ã'
-        44: 0,  # 'É'
-        61: 0,  # 'Ã'
-        58: 0,  # 'Ó'
-        59: 0,  # 'Ö'
-        60: 0,  # 'Ú'
-        63: 0,  # 'Ü'
-        14: 0,  # 'á'
-        15: 0,  # 'é'
-        30: 0,  # 'í'
-        25: 0,  # 'ó'
-        24: 0,  # 'ö'
-        31: 0,  # 'ú'
-        29: 0,  # 'ü'
-        42: 0,  # 'Å‘'
-        56: 0,  # 'ű'
-    },
-}
-
-# 255: Undefined characters that did not exist in training text
-# 254: Carriage/Return
-# 253: symbol (punctuation) that does not belong to word
-# 252: 0 - 9
-# 251: Control characters
-
-# Character Mapping Table(s):
-WINDOWS_1250_HUNGARIAN_CHAR_TO_ORDER = {
-     0: 255,  # '\x00'
-     1: 255,  # '\x01'
-     2: 255,  # '\x02'
-     3: 255,  # '\x03'
-     4: 255,  # '\x04'
-     5: 255,  # '\x05'
-     6: 255,  # '\x06'
-     7: 255,  # '\x07'
-     8: 255,  # '\x08'
-     9: 255,  # '\t'
-     10: 254,  # '\n'
-     11: 255,  # '\x0b'
-     12: 255,  # '\x0c'
-     13: 254,  # '\r'
-     14: 255,  # '\x0e'
-     15: 255,  # '\x0f'
-     16: 255,  # '\x10'
-     17: 255,  # '\x11'
-     18: 255,  # '\x12'
-     19: 255,  # '\x13'
-     20: 255,  # '\x14'
-     21: 255,  # '\x15'
-     22: 255,  # '\x16'
-     23: 255,  # '\x17'
-     24: 255,  # '\x18'
-     25: 255,  # '\x19'
-     26: 255,  # '\x1a'
-     27: 255,  # '\x1b'
-     28: 255,  # '\x1c'
-     29: 255,  # '\x1d'
-     30: 255,  # '\x1e'
-     31: 255,  # '\x1f'
-     32: 253,  # ' '
-     33: 253,  # '!'
-     34: 253,  # '"'
-     35: 253,  # '#'
-     36: 253,  # '$'
-     37: 253,  # '%'
-     38: 253,  # '&'
-     39: 253,  # "'"
-     40: 253,  # '('
-     41: 253,  # ')'
-     42: 253,  # '*'
-     43: 253,  # '+'
-     44: 253,  # ','
-     45: 253,  # '-'
-     46: 253,  # '.'
-     47: 253,  # '/'
-     48: 252,  # '0'
-     49: 252,  # '1'
-     50: 252,  # '2'
-     51: 252,  # '3'
-     52: 252,  # '4'
-     53: 252,  # '5'
-     54: 252,  # '6'
-     55: 252,  # '7'
-     56: 252,  # '8'
-     57: 252,  # '9'
-     58: 253,  # ':'
-     59: 253,  # ';'
-     60: 253,  # '<'
-     61: 253,  # '='
-     62: 253,  # '>'
-     63: 253,  # '?'
-     64: 253,  # '@'
-     65: 28,  # 'A'
-     66: 40,  # 'B'
-     67: 54,  # 'C'
-     68: 45,  # 'D'
-     69: 32,  # 'E'
-     70: 50,  # 'F'
-     71: 49,  # 'G'
-     72: 38,  # 'H'
-     73: 39,  # 'I'
-     74: 53,  # 'J'
-     75: 36,  # 'K'
-     76: 41,  # 'L'
-     77: 34,  # 'M'
-     78: 35,  # 'N'
-     79: 47,  # 'O'
-     80: 46,  # 'P'
-     81: 72,  # 'Q'
-     82: 43,  # 'R'
-     83: 33,  # 'S'
-     84: 37,  # 'T'
-     85: 57,  # 'U'
-     86: 48,  # 'V'
-     87: 64,  # 'W'
-     88: 68,  # 'X'
-     89: 55,  # 'Y'
-     90: 52,  # 'Z'
-     91: 253,  # '['
-     92: 253,  # '\\'
-     93: 253,  # ']'
-     94: 253,  # '^'
-     95: 253,  # '_'
-     96: 253,  # '`'
-     97: 2,  # 'a'
-     98: 18,  # 'b'
-     99: 26,  # 'c'
-     100: 17,  # 'd'
-     101: 1,  # 'e'
-     102: 27,  # 'f'
-     103: 12,  # 'g'
-     104: 20,  # 'h'
-     105: 9,  # 'i'
-     106: 22,  # 'j'
-     107: 7,  # 'k'
-     108: 6,  # 'l'
-     109: 13,  # 'm'
-     110: 4,  # 'n'
-     111: 8,  # 'o'
-     112: 23,  # 'p'
-     113: 67,  # 'q'
-     114: 10,  # 'r'
-     115: 5,  # 's'
-     116: 3,  # 't'
-     117: 21,  # 'u'
-     118: 19,  # 'v'
-     119: 65,  # 'w'
-     120: 62,  # 'x'
-     121: 16,  # 'y'
-     122: 11,  # 'z'
-     123: 253,  # '{'
-     124: 253,  # '|'
-     125: 253,  # '}'
-     126: 253,  # '~'
-     127: 253,  # '\x7f'
-     128: 161,  # '€'
-     129: 162,  # None
-     130: 163,  # '‚'
-     131: 164,  # None
-     132: 165,  # '„'
-     133: 166,  # '…'
-     134: 167,  # '†'
-     135: 168,  # '‡'
-     136: 169,  # None
-     137: 170,  # '‰'
-     138: 171,  # 'Å '
-     139: 172,  # '‹'
-     140: 173,  # 'Åš'
-     141: 174,  # 'Ť'
-     142: 175,  # 'Ž'
-     143: 176,  # 'Ź'
-     144: 177,  # None
-     145: 178,  # '‘'
-     146: 179,  # '’'
-     147: 180,  # '“'
-     148: 78,  # 'â€'
-     149: 181,  # '•'
-     150: 69,  # '–'
-     151: 182,  # '—'
-     152: 183,  # None
-     153: 184,  # 'â„¢'
-     154: 185,  # 'Å¡'
-     155: 186,  # '›'
-     156: 187,  # 'Å›'
-     157: 188,  # 'Å¥'
-     158: 189,  # 'ž'
-     159: 190,  # 'ź'
-     160: 191,  # '\xa0'
-     161: 192,  # 'ˇ'
-     162: 193,  # '˘'
-     163: 194,  # 'Å'
-     164: 195,  # '¤'
-     165: 196,  # 'Ä„'
-     166: 197,  # '¦'
-     167: 76,  # '§'
-     168: 198,  # '¨'
-     169: 199,  # '©'
-     170: 200,  # 'Åž'
-     171: 201,  # '«'
-     172: 202,  # '¬'
-     173: 203,  # '\xad'
-     174: 204,  # '®'
-     175: 205,  # 'Å»'
-     176: 81,  # '°'
-     177: 206,  # '±'
-     178: 207,  # 'Ë›'
-     179: 208,  # 'Å‚'
-     180: 209,  # '´'
-     181: 210,  # 'µ'
-     182: 211,  # '¶'
-     183: 212,  # '·'
-     184: 213,  # '¸'
-     185: 214,  # 'Ä…'
-     186: 215,  # 'ÅŸ'
-     187: 216,  # '»'
-     188: 217,  # 'Ľ'
-     189: 218,  # 'Ë'
-     190: 219,  # 'ľ'
-     191: 220,  # 'ż'
-     192: 221,  # 'Å”'
-     193: 51,  # 'Ã'
-     194: 83,  # 'Â'
-     195: 222,  # 'Ä‚'
-     196: 80,  # 'Ä'
-     197: 223,  # 'Ĺ'
-     198: 224,  # 'Ć'
-     199: 225,  # 'Ç'
-     200: 226,  # 'Č'
-     201: 44,  # 'É'
-     202: 227,  # 'Ę'
-     203: 228,  # 'Ë'
-     204: 229,  # 'Äš'
-     205: 61,  # 'Ã'
-     206: 230,  # 'ÃŽ'
-     207: 231,  # 'ÄŽ'
-     208: 232,  # 'Ä'
-     209: 233,  # 'Ń'
-     210: 234,  # 'Ň'
-     211: 58,  # 'Ó'
-     212: 235,  # 'Ô'
-     213: 66,  # 'Å'
-     214: 59,  # 'Ö'
-     215: 236,  # '×'
-     216: 237,  # 'Ř'
-     217: 238,  # 'Å®'
-     218: 60,  # 'Ú'
-     219: 70,  # 'Ű'
-     220: 63,  # 'Ü'
-     221: 239,  # 'Ã'
-     222: 240,  # 'Å¢'
-     223: 241,  # 'ß'
-     224: 84,  # 'Å•'
-     225: 14,  # 'á'
-     226: 75,  # 'â'
-     227: 242,  # 'ă'
-     228: 71,  # 'ä'
-     229: 82,  # 'ĺ'
-     230: 243,  # 'ć'
-     231: 73,  # 'ç'
-     232: 244,  # 'Ä'
-     233: 15,  # 'é'
-     234: 85,  # 'Ä™'
-     235: 79,  # 'ë'
-     236: 86,  # 'Ä›'
-     237: 30,  # 'í'
-     238: 77,  # 'î'
-     239: 87,  # 'Ä'
-     240: 245,  # 'Ä‘'
-     241: 246,  # 'Å„'
-     242: 247,  # 'ň'
-     243: 25,  # 'ó'
-     244: 74,  # 'ô'
-     245: 42,  # 'Å‘'
-     246: 24,  # 'ö'
-     247: 248,  # '÷'
-     248: 249,  # 'Å™'
-     249: 250,  # 'ů'
-     250: 31,  # 'ú'
-     251: 56,  # 'ű'
-     252: 29,  # 'ü'
-     253: 251,  # 'ý'
-     254: 252,  # 'Å£'
-     255: 253,  # 'Ë™'
-}
-
-WINDOWS_1250_HUNGARIAN_MODEL = SingleByteCharSetModel(charset_name='windows-1250',
-                                                      language='Hungarian',
-                                                      char_to_order_map=WINDOWS_1250_HUNGARIAN_CHAR_TO_ORDER,
-                                                      language_model=HUNGARIAN_LANG_MODEL,
-                                                      typical_positive_ratio=0.947368,
-                                                      keep_ascii_letters=True,
-                                                      alphabet='ABCDEFGHIJKLMNOPRSTUVZabcdefghijklmnoprstuvzÃÉÃÓÖÚÜáéíóöúüÅőŰű')
-
-ISO_8859_2_HUNGARIAN_CHAR_TO_ORDER = {
-     0: 255,  # '\x00'
-     1: 255,  # '\x01'
-     2: 255,  # '\x02'
-     3: 255,  # '\x03'
-     4: 255,  # '\x04'
-     5: 255,  # '\x05'
-     6: 255,  # '\x06'
-     7: 255,  # '\x07'
-     8: 255,  # '\x08'
-     9: 255,  # '\t'
-     10: 254,  # '\n'
-     11: 255,  # '\x0b'
-     12: 255,  # '\x0c'
-     13: 254,  # '\r'
-     14: 255,  # '\x0e'
-     15: 255,  # '\x0f'
-     16: 255,  # '\x10'
-     17: 255,  # '\x11'
-     18: 255,  # '\x12'
-     19: 255,  # '\x13'
-     20: 255,  # '\x14'
-     21: 255,  # '\x15'
-     22: 255,  # '\x16'
-     23: 255,  # '\x17'
-     24: 255,  # '\x18'
-     25: 255,  # '\x19'
-     26: 255,  # '\x1a'
-     27: 255,  # '\x1b'
-     28: 255,  # '\x1c'
-     29: 255,  # '\x1d'
-     30: 255,  # '\x1e'
-     31: 255,  # '\x1f'
-     32: 253,  # ' '
-     33: 253,  # '!'
-     34: 253,  # '"'
-     35: 253,  # '#'
-     36: 253,  # '$'
-     37: 253,  # '%'
-     38: 253,  # '&'
-     39: 253,  # "'"
-     40: 253,  # '('
-     41: 253,  # ')'
-     42: 253,  # '*'
-     43: 253,  # '+'
-     44: 253,  # ','
-     45: 253,  # '-'
-     46: 253,  # '.'
-     47: 253,  # '/'
-     48: 252,  # '0'
-     49: 252,  # '1'
-     50: 252,  # '2'
-     51: 252,  # '3'
-     52: 252,  # '4'
-     53: 252,  # '5'
-     54: 252,  # '6'
-     55: 252,  # '7'
-     56: 252,  # '8'
-     57: 252,  # '9'
-     58: 253,  # ':'
-     59: 253,  # ';'
-     60: 253,  # '<'
-     61: 253,  # '='
-     62: 253,  # '>'
-     63: 253,  # '?'
-     64: 253,  # '@'
-     65: 28,  # 'A'
-     66: 40,  # 'B'
-     67: 54,  # 'C'
-     68: 45,  # 'D'
-     69: 32,  # 'E'
-     70: 50,  # 'F'
-     71: 49,  # 'G'
-     72: 38,  # 'H'
-     73: 39,  # 'I'
-     74: 53,  # 'J'
-     75: 36,  # 'K'
-     76: 41,  # 'L'
-     77: 34,  # 'M'
-     78: 35,  # 'N'
-     79: 47,  # 'O'
-     80: 46,  # 'P'
-     81: 71,  # 'Q'
-     82: 43,  # 'R'
-     83: 33,  # 'S'
-     84: 37,  # 'T'
-     85: 57,  # 'U'
-     86: 48,  # 'V'
-     87: 64,  # 'W'
-     88: 68,  # 'X'
-     89: 55,  # 'Y'
-     90: 52,  # 'Z'
-     91: 253,  # '['
-     92: 253,  # '\\'
-     93: 253,  # ']'
-     94: 253,  # '^'
-     95: 253,  # '_'
-     96: 253,  # '`'
-     97: 2,  # 'a'
-     98: 18,  # 'b'
-     99: 26,  # 'c'
-     100: 17,  # 'd'
-     101: 1,  # 'e'
-     102: 27,  # 'f'
-     103: 12,  # 'g'
-     104: 20,  # 'h'
-     105: 9,  # 'i'
-     106: 22,  # 'j'
-     107: 7,  # 'k'
-     108: 6,  # 'l'
-     109: 13,  # 'm'
-     110: 4,  # 'n'
-     111: 8,  # 'o'
-     112: 23,  # 'p'
-     113: 67,  # 'q'
-     114: 10,  # 'r'
-     115: 5,  # 's'
-     116: 3,  # 't'
-     117: 21,  # 'u'
-     118: 19,  # 'v'
-     119: 65,  # 'w'
-     120: 62,  # 'x'
-     121: 16,  # 'y'
-     122: 11,  # 'z'
-     123: 253,  # '{'
-     124: 253,  # '|'
-     125: 253,  # '}'
-     126: 253,  # '~'
-     127: 253,  # '\x7f'
-     128: 159,  # '\x80'
-     129: 160,  # '\x81'
-     130: 161,  # '\x82'
-     131: 162,  # '\x83'
-     132: 163,  # '\x84'
-     133: 164,  # '\x85'
-     134: 165,  # '\x86'
-     135: 166,  # '\x87'
-     136: 167,  # '\x88'
-     137: 168,  # '\x89'
-     138: 169,  # '\x8a'
-     139: 170,  # '\x8b'
-     140: 171,  # '\x8c'
-     141: 172,  # '\x8d'
-     142: 173,  # '\x8e'
-     143: 174,  # '\x8f'
-     144: 175,  # '\x90'
-     145: 176,  # '\x91'
-     146: 177,  # '\x92'
-     147: 178,  # '\x93'
-     148: 179,  # '\x94'
-     149: 180,  # '\x95'
-     150: 181,  # '\x96'
-     151: 182,  # '\x97'
-     152: 183,  # '\x98'
-     153: 184,  # '\x99'
-     154: 185,  # '\x9a'
-     155: 186,  # '\x9b'
-     156: 187,  # '\x9c'
-     157: 188,  # '\x9d'
-     158: 189,  # '\x9e'
-     159: 190,  # '\x9f'
-     160: 191,  # '\xa0'
-     161: 192,  # 'Ä„'
-     162: 193,  # '˘'
-     163: 194,  # 'Å'
-     164: 195,  # '¤'
-     165: 196,  # 'Ľ'
-     166: 197,  # 'Åš'
-     167: 75,  # '§'
-     168: 198,  # '¨'
-     169: 199,  # 'Å '
-     170: 200,  # 'Åž'
-     171: 201,  # 'Ť'
-     172: 202,  # 'Ź'
-     173: 203,  # '\xad'
-     174: 204,  # 'Ž'
-     175: 205,  # 'Å»'
-     176: 79,  # '°'
-     177: 206,  # 'Ä…'
-     178: 207,  # 'Ë›'
-     179: 208,  # 'Å‚'
-     180: 209,  # '´'
-     181: 210,  # 'ľ'
-     182: 211,  # 'Å›'
-     183: 212,  # 'ˇ'
-     184: 213,  # '¸'
-     185: 214,  # 'Å¡'
-     186: 215,  # 'ÅŸ'
-     187: 216,  # 'Å¥'
-     188: 217,  # 'ź'
-     189: 218,  # 'Ë'
-     190: 219,  # 'ž'
-     191: 220,  # 'ż'
-     192: 221,  # 'Å”'
-     193: 51,  # 'Ã'
-     194: 81,  # 'Â'
-     195: 222,  # 'Ä‚'
-     196: 78,  # 'Ä'
-     197: 223,  # 'Ĺ'
-     198: 224,  # 'Ć'
-     199: 225,  # 'Ç'
-     200: 226,  # 'Č'
-     201: 44,  # 'É'
-     202: 227,  # 'Ę'
-     203: 228,  # 'Ë'
-     204: 229,  # 'Äš'
-     205: 61,  # 'Ã'
-     206: 230,  # 'ÃŽ'
-     207: 231,  # 'ÄŽ'
-     208: 232,  # 'Ä'
-     209: 233,  # 'Ń'
-     210: 234,  # 'Ň'
-     211: 58,  # 'Ó'
-     212: 235,  # 'Ô'
-     213: 66,  # 'Å'
-     214: 59,  # 'Ö'
-     215: 236,  # '×'
-     216: 237,  # 'Ř'
-     217: 238,  # 'Å®'
-     218: 60,  # 'Ú'
-     219: 69,  # 'Ű'
-     220: 63,  # 'Ü'
-     221: 239,  # 'Ã'
-     222: 240,  # 'Å¢'
-     223: 241,  # 'ß'
-     224: 82,  # 'Å•'
-     225: 14,  # 'á'
-     226: 74,  # 'â'
-     227: 242,  # 'ă'
-     228: 70,  # 'ä'
-     229: 80,  # 'ĺ'
-     230: 243,  # 'ć'
-     231: 72,  # 'ç'
-     232: 244,  # 'Ä'
-     233: 15,  # 'é'
-     234: 83,  # 'Ä™'
-     235: 77,  # 'ë'
-     236: 84,  # 'Ä›'
-     237: 30,  # 'í'
-     238: 76,  # 'î'
-     239: 85,  # 'Ä'
-     240: 245,  # 'Ä‘'
-     241: 246,  # 'Å„'
-     242: 247,  # 'ň'
-     243: 25,  # 'ó'
-     244: 73,  # 'ô'
-     245: 42,  # 'Å‘'
-     246: 24,  # 'ö'
-     247: 248,  # '÷'
-     248: 249,  # 'Å™'
-     249: 250,  # 'ů'
-     250: 31,  # 'ú'
-     251: 56,  # 'ű'
-     252: 29,  # 'ü'
-     253: 251,  # 'ý'
-     254: 252,  # 'Å£'
-     255: 253,  # 'Ë™'
-}
-
-ISO_8859_2_HUNGARIAN_MODEL = SingleByteCharSetModel(charset_name='ISO-8859-2',
-                                                    language='Hungarian',
-                                                    char_to_order_map=ISO_8859_2_HUNGARIAN_CHAR_TO_ORDER,
-                                                    language_model=HUNGARIAN_LANG_MODEL,
-                                                    typical_positive_ratio=0.947368,
-                                                    keep_ascii_letters=True,
-                                                    alphabet='ABCDEFGHIJKLMNOPRSTUVZabcdefghijklmnoprstuvzÃÉÃÓÖÚÜáéíóöúüÅőŰű')
-
diff --git a/lib/sub_repos/chardet/chardet/langrussianmodel.py b/lib/sub_repos/chardet/chardet/langrussianmodel.py
deleted file mode 100644
index 569689d0f..000000000
--- a/lib/sub_repos/chardet/chardet/langrussianmodel.py
+++ /dev/null
@@ -1,5718 +0,0 @@
-#!/usr/bin/env python
-# -*- coding: utf-8 -*-
-
-from chardet.sbcharsetprober import SingleByteCharSetModel
-
-
-# 3: Positive
-# 2: Likely
-# 1: Unlikely
-# 0: Negative
-
-RUSSIAN_LANG_MODEL = {
-    37: {  # 'Ð'
-        37: 0,  # 'Ð'
-        44: 1,  # 'Б'
-        33: 1,  # 'Ð’'
-        46: 1,  # 'Г'
-        41: 1,  # 'Д'
-        48: 1,  # 'Е'
-        56: 1,  # 'Ж'
-        51: 1,  # 'З'
-        42: 1,  # 'И'
-        60: 1,  # 'Й'
-        36: 1,  # 'К'
-        49: 1,  # 'Л'
-        38: 1,  # 'М'
-        31: 2,  # 'Ð'
-        34: 1,  # 'О'
-        35: 1,  # 'П'
-        45: 1,  # 'Р'
-        32: 1,  # 'С'
-        40: 1,  # 'Т'
-        52: 1,  # 'У'
-        53: 1,  # 'Ф'
-        55: 1,  # 'Ð¥'
-        58: 1,  # 'Ц'
-        50: 1,  # 'Ч'
-        57: 1,  # 'Ш'
-        63: 1,  # 'Щ'
-        62: 0,  # 'Ы'
-        61: 0,  # 'Ь'
-        47: 0,  # 'Э'
-        59: 1,  # 'Ю'
-        43: 1,  # 'Я'
-        3: 1,  # 'а'
-        21: 2,  # 'б'
-        10: 2,  # 'в'
-        19: 2,  # 'г'
-        13: 2,  # 'д'
-        2: 0,  # 'е'
-        24: 1,  # 'ж'
-        20: 1,  # 'з'
-        4: 0,  # 'и'
-        23: 1,  # 'й'
-        11: 2,  # 'к'
-        8: 3,  # 'л'
-        12: 2,  # 'м'
-        5: 2,  # 'н'
-        1: 0,  # 'о'
-        15: 2,  # 'п'
-        9: 2,  # 'Ñ€'
-        7: 2,  # 'Ñ'
-        6: 2,  # 'Ñ‚'
-        14: 2,  # 'у'
-        39: 2,  # 'Ñ„'
-        26: 2,  # 'Ñ…'
-        28: 0,  # 'ц'
-        22: 1,  # 'ч'
-        25: 2,  # 'ш'
-        29: 0,  # 'щ'
-        54: 0,  # 'ÑŠ'
-        18: 0,  # 'Ñ‹'
-        17: 0,  # 'ь'
-        30: 1,  # 'Ñ'
-        27: 0,  # 'ÑŽ'
-        16: 0,  # 'Ñ'
-    },
-    44: {  # 'Б'
-        37: 1,  # 'Ð'
-        44: 0,  # 'Б'
-        33: 1,  # 'Ð’'
-        46: 1,  # 'Г'
-        41: 0,  # 'Д'
-        48: 1,  # 'Е'
-        56: 0,  # 'Ж'
-        51: 0,  # 'З'
-        42: 1,  # 'И'
-        60: 0,  # 'Й'
-        36: 0,  # 'К'
-        49: 1,  # 'Л'
-        38: 1,  # 'М'
-        31: 1,  # 'Ð'
-        34: 1,  # 'О'
-        35: 0,  # 'П'
-        45: 1,  # 'Р'
-        32: 0,  # 'С'
-        40: 0,  # 'Т'
-        52: 1,  # 'У'
-        53: 0,  # 'Ф'
-        55: 0,  # 'Ð¥'
-        58: 0,  # 'Ц'
-        50: 0,  # 'Ч'
-        57: 0,  # 'Ш'
-        63: 0,  # 'Щ'
-        62: 1,  # 'Ы'
-        61: 0,  # 'Ь'
-        47: 0,  # 'Э'
-        59: 0,  # 'Ю'
-        43: 1,  # 'Я'
-        3: 2,  # 'а'
-        21: 0,  # 'б'
-        10: 0,  # 'в'
-        19: 0,  # 'г'
-        13: 1,  # 'д'
-        2: 3,  # 'е'
-        24: 0,  # 'ж'
-        20: 0,  # 'з'
-        4: 2,  # 'и'
-        23: 0,  # 'й'
-        11: 0,  # 'к'
-        8: 2,  # 'л'
-        12: 0,  # 'м'
-        5: 0,  # 'н'
-        1: 3,  # 'о'
-        15: 0,  # 'п'
-        9: 2,  # 'Ñ€'
-        7: 0,  # 'Ñ'
-        6: 0,  # 'Ñ‚'
-        14: 2,  # 'у'
-        39: 0,  # 'Ñ„'
-        26: 0,  # 'Ñ…'
-        28: 0,  # 'ц'
-        22: 0,  # 'ч'
-        25: 0,  # 'ш'
-        29: 0,  # 'щ'
-        54: 0,  # 'ÑŠ'
-        18: 2,  # 'Ñ‹'
-        17: 1,  # 'ь'
-        30: 2,  # 'Ñ'
-        27: 1,  # 'ÑŽ'
-        16: 1,  # 'Ñ'
-    },
-    33: {  # 'Ð’'
-        37: 2,  # 'Ð'
-        44: 0,  # 'Б'
-        33: 1,  # 'Ð’'
-        46: 0,  # 'Г'
-        41: 1,  # 'Д'
-        48: 1,  # 'Е'
-        56: 0,  # 'Ж'
-        51: 0,  # 'З'
-        42: 1,  # 'И'
-        60: 0,  # 'Й'
-        36: 1,  # 'К'
-        49: 1,  # 'Л'
-        38: 1,  # 'М'
-        31: 1,  # 'Ð'
-        34: 1,  # 'О'
-        35: 1,  # 'П'
-        45: 1,  # 'Р'
-        32: 1,  # 'С'
-        40: 1,  # 'Т'
-        52: 1,  # 'У'
-        53: 0,  # 'Ф'
-        55: 0,  # 'Ð¥'
-        58: 0,  # 'Ц'
-        50: 0,  # 'Ч'
-        57: 1,  # 'Ш'
-        63: 0,  # 'Щ'
-        62: 1,  # 'Ы'
-        61: 1,  # 'Ь'
-        47: 0,  # 'Э'
-        59: 0,  # 'Ю'
-        43: 1,  # 'Я'
-        3: 2,  # 'а'
-        21: 1,  # 'б'
-        10: 1,  # 'в'
-        19: 1,  # 'г'
-        13: 2,  # 'д'
-        2: 3,  # 'е'
-        24: 0,  # 'ж'
-        20: 2,  # 'з'
-        4: 2,  # 'и'
-        23: 0,  # 'й'
-        11: 1,  # 'к'
-        8: 2,  # 'л'
-        12: 2,  # 'м'
-        5: 2,  # 'н'
-        1: 3,  # 'о'
-        15: 2,  # 'п'
-        9: 2,  # 'Ñ€'
-        7: 3,  # 'Ñ'
-        6: 2,  # 'Ñ‚'
-        14: 2,  # 'у'
-        39: 0,  # 'Ñ„'
-        26: 1,  # 'Ñ…'
-        28: 1,  # 'ц'
-        22: 2,  # 'ч'
-        25: 1,  # 'ш'
-        29: 0,  # 'щ'
-        54: 1,  # 'ÑŠ'
-        18: 3,  # 'Ñ‹'
-        17: 1,  # 'ь'
-        30: 2,  # 'Ñ'
-        27: 0,  # 'ÑŽ'
-        16: 1,  # 'Ñ'
-    },
-    46: {  # 'Г'
-        37: 1,  # 'Ð'
-        44: 1,  # 'Б'
-        33: 0,  # 'Ð’'
-        46: 0,  # 'Г'
-        41: 1,  # 'Д'
-        48: 1,  # 'Е'
-        56: 0,  # 'Ж'
-        51: 0,  # 'З'
-        42: 1,  # 'И'
-        60: 0,  # 'Й'
-        36: 0,  # 'К'
-        49: 1,  # 'Л'
-        38: 1,  # 'М'
-        31: 1,  # 'Ð'
-        34: 1,  # 'О'
-        35: 1,  # 'П'
-        45: 1,  # 'Р'
-        32: 0,  # 'С'
-        40: 0,  # 'Т'
-        52: 1,  # 'У'
-        53: 0,  # 'Ф'
-        55: 0,  # 'Ð¥'
-        58: 0,  # 'Ц'
-        50: 0,  # 'Ч'
-        57: 0,  # 'Ш'
-        63: 0,  # 'Щ'
-        62: 0,  # 'Ы'
-        61: 0,  # 'Ь'
-        47: 0,  # 'Э'
-        59: 0,  # 'Ю'
-        43: 0,  # 'Я'
-        3: 2,  # 'а'
-        21: 0,  # 'б'
-        10: 1,  # 'в'
-        19: 0,  # 'г'
-        13: 2,  # 'д'
-        2: 2,  # 'е'
-        24: 0,  # 'ж'
-        20: 0,  # 'з'
-        4: 2,  # 'и'
-        23: 0,  # 'й'
-        11: 0,  # 'к'
-        8: 2,  # 'л'
-        12: 1,  # 'м'
-        5: 1,  # 'н'
-        1: 3,  # 'о'
-        15: 0,  # 'п'
-        9: 2,  # 'Ñ€'
-        7: 0,  # 'Ñ'
-        6: 0,  # 'Ñ‚'
-        14: 2,  # 'у'
-        39: 0,  # 'Ñ„'
-        26: 0,  # 'Ñ…'
-        28: 0,  # 'ц'
-        22: 0,  # 'ч'
-        25: 0,  # 'ш'
-        29: 0,  # 'щ'
-        54: 0,  # 'ÑŠ'
-        18: 0,  # 'Ñ‹'
-        17: 1,  # 'ь'
-        30: 1,  # 'Ñ'
-        27: 1,  # 'ÑŽ'
-        16: 0,  # 'Ñ'
-    },
-    41: {  # 'Д'
-        37: 1,  # 'Ð'
-        44: 0,  # 'Б'
-        33: 1,  # 'Ð’'
-        46: 0,  # 'Г'
-        41: 0,  # 'Д'
-        48: 2,  # 'Е'
-        56: 1,  # 'Ж'
-        51: 0,  # 'З'
-        42: 1,  # 'И'
-        60: 0,  # 'Й'
-        36: 1,  # 'К'
-        49: 1,  # 'Л'
-        38: 0,  # 'М'
-        31: 1,  # 'Ð'
-        34: 1,  # 'О'
-        35: 0,  # 'П'
-        45: 1,  # 'Р'
-        32: 1,  # 'С'
-        40: 0,  # 'Т'
-        52: 1,  # 'У'
-        53: 0,  # 'Ф'
-        55: 0,  # 'Ð¥'
-        58: 1,  # 'Ц'
-        50: 1,  # 'Ч'
-        57: 0,  # 'Ш'
-        63: 0,  # 'Щ'
-        62: 1,  # 'Ы'
-        61: 1,  # 'Ь'
-        47: 0,  # 'Э'
-        59: 0,  # 'Ю'
-        43: 1,  # 'Я'
-        3: 3,  # 'а'
-        21: 0,  # 'б'
-        10: 2,  # 'в'
-        19: 0,  # 'г'
-        13: 0,  # 'д'
-        2: 2,  # 'е'
-        24: 3,  # 'ж'
-        20: 1,  # 'з'
-        4: 2,  # 'и'
-        23: 0,  # 'й'
-        11: 0,  # 'к'
-        8: 2,  # 'л'
-        12: 1,  # 'м'
-        5: 1,  # 'н'
-        1: 3,  # 'о'
-        15: 0,  # 'п'
-        9: 2,  # 'Ñ€'
-        7: 0,  # 'Ñ'
-        6: 0,  # 'Ñ‚'
-        14: 2,  # 'у'
-        39: 0,  # 'Ñ„'
-        26: 1,  # 'Ñ…'
-        28: 0,  # 'ц'
-        22: 0,  # 'ч'
-        25: 0,  # 'ш'
-        29: 0,  # 'щ'
-        54: 0,  # 'ÑŠ'
-        18: 1,  # 'Ñ‹'
-        17: 1,  # 'ь'
-        30: 2,  # 'Ñ'
-        27: 1,  # 'ÑŽ'
-        16: 1,  # 'Ñ'
-    },
-    48: {  # 'Е'
-        37: 1,  # 'Ð'
-        44: 1,  # 'Б'
-        33: 1,  # 'Ð’'
-        46: 1,  # 'Г'
-        41: 1,  # 'Д'
-        48: 1,  # 'Е'
-        56: 1,  # 'Ж'
-        51: 1,  # 'З'
-        42: 1,  # 'И'
-        60: 1,  # 'Й'
-        36: 1,  # 'К'
-        49: 1,  # 'Л'
-        38: 1,  # 'М'
-        31: 2,  # 'Ð'
-        34: 1,  # 'О'
-        35: 1,  # 'П'
-        45: 2,  # 'Р'
-        32: 2,  # 'С'
-        40: 1,  # 'Т'
-        52: 0,  # 'У'
-        53: 0,  # 'Ф'
-        55: 1,  # 'Ð¥'
-        58: 1,  # 'Ц'
-        50: 1,  # 'Ч'
-        57: 1,  # 'Ш'
-        63: 1,  # 'Щ'
-        62: 0,  # 'Ы'
-        61: 0,  # 'Ь'
-        47: 0,  # 'Э'
-        59: 0,  # 'Ю'
-        43: 1,  # 'Я'
-        3: 0,  # 'а'
-        21: 0,  # 'б'
-        10: 2,  # 'в'
-        19: 2,  # 'г'
-        13: 2,  # 'д'
-        2: 2,  # 'е'
-        24: 1,  # 'ж'
-        20: 1,  # 'з'
-        4: 0,  # 'и'
-        23: 2,  # 'й'
-        11: 1,  # 'к'
-        8: 2,  # 'л'
-        12: 2,  # 'м'
-        5: 1,  # 'н'
-        1: 0,  # 'о'
-        15: 1,  # 'п'
-        9: 1,  # 'Ñ€'
-        7: 3,  # 'Ñ'
-        6: 0,  # 'Ñ‚'
-        14: 0,  # 'у'
-        39: 1,  # 'Ñ„'
-        26: 1,  # 'Ñ…'
-        28: 0,  # 'ц'
-        22: 0,  # 'ч'
-        25: 1,  # 'ш'
-        29: 2,  # 'щ'
-        54: 0,  # 'ÑŠ'
-        18: 0,  # 'Ñ‹'
-        17: 0,  # 'ь'
-        30: 0,  # 'Ñ'
-        27: 1,  # 'ÑŽ'
-        16: 0,  # 'Ñ'
-    },
-    56: {  # 'Ж'
-        37: 1,  # 'Ð'
-        44: 0,  # 'Б'
-        33: 0,  # 'Ð’'
-        46: 0,  # 'Г'
-        41: 1,  # 'Д'
-        48: 1,  # 'Е'
-        56: 0,  # 'Ж'
-        51: 1,  # 'З'
-        42: 1,  # 'И'
-        60: 0,  # 'Й'
-        36: 0,  # 'К'
-        49: 0,  # 'Л'
-        38: 0,  # 'М'
-        31: 1,  # 'Ð'
-        34: 1,  # 'О'
-        35: 0,  # 'П'
-        45: 0,  # 'Р'
-        32: 0,  # 'С'
-        40: 0,  # 'Т'
-        52: 1,  # 'У'
-        53: 0,  # 'Ф'
-        55: 0,  # 'Ð¥'
-        58: 0,  # 'Ц'
-        50: 0,  # 'Ч'
-        57: 0,  # 'Ш'
-        63: 0,  # 'Щ'
-        62: 0,  # 'Ы'
-        61: 0,  # 'Ь'
-        47: 0,  # 'Э'
-        59: 0,  # 'Ю'
-        43: 0,  # 'Я'
-        3: 2,  # 'а'
-        21: 1,  # 'б'
-        10: 0,  # 'в'
-        19: 1,  # 'г'
-        13: 1,  # 'д'
-        2: 2,  # 'е'
-        24: 1,  # 'ж'
-        20: 0,  # 'з'
-        4: 2,  # 'и'
-        23: 0,  # 'й'
-        11: 0,  # 'к'
-        8: 0,  # 'л'
-        12: 1,  # 'м'
-        5: 0,  # 'н'
-        1: 2,  # 'о'
-        15: 0,  # 'п'
-        9: 1,  # 'Ñ€'
-        7: 0,  # 'Ñ'
-        6: 0,  # 'Ñ‚'
-        14: 2,  # 'у'
-        39: 0,  # 'Ñ„'
-        26: 0,  # 'Ñ…'
-        28: 0,  # 'ц'
-        22: 0,  # 'ч'
-        25: 0,  # 'ш'
-        29: 0,  # 'щ'
-        54: 0,  # 'ÑŠ'
-        18: 0,  # 'Ñ‹'
-        17: 0,  # 'ь'
-        30: 0,  # 'Ñ'
-        27: 2,  # 'ÑŽ'
-        16: 0,  # 'Ñ'
-    },
-    51: {  # 'З'
-        37: 1,  # 'Ð'
-        44: 0,  # 'Б'
-        33: 1,  # 'Ð’'
-        46: 1,  # 'Г'
-        41: 1,  # 'Д'
-        48: 1,  # 'Е'
-        56: 0,  # 'Ж'
-        51: 0,  # 'З'
-        42: 1,  # 'И'
-        60: 0,  # 'Й'
-        36: 0,  # 'К'
-        49: 1,  # 'Л'
-        38: 1,  # 'М'
-        31: 1,  # 'Ð'
-        34: 1,  # 'О'
-        35: 0,  # 'П'
-        45: 1,  # 'Р'
-        32: 0,  # 'С'
-        40: 0,  # 'Т'
-        52: 1,  # 'У'
-        53: 0,  # 'Ф'
-        55: 0,  # 'Ð¥'
-        58: 0,  # 'Ц'
-        50: 0,  # 'Ч'
-        57: 0,  # 'Ш'
-        63: 0,  # 'Щ'
-        62: 1,  # 'Ы'
-        61: 1,  # 'Ь'
-        47: 0,  # 'Э'
-        59: 0,  # 'Ю'
-        43: 0,  # 'Я'
-        3: 3,  # 'а'
-        21: 1,  # 'б'
-        10: 2,  # 'в'
-        19: 0,  # 'г'
-        13: 2,  # 'д'
-        2: 2,  # 'е'
-        24: 0,  # 'ж'
-        20: 0,  # 'з'
-        4: 2,  # 'и'
-        23: 0,  # 'й'
-        11: 0,  # 'к'
-        8: 1,  # 'л'
-        12: 1,  # 'м'
-        5: 2,  # 'н'
-        1: 2,  # 'о'
-        15: 0,  # 'п'
-        9: 1,  # 'Ñ€'
-        7: 0,  # 'Ñ'
-        6: 0,  # 'Ñ‚'
-        14: 1,  # 'у'
-        39: 0,  # 'Ñ„'
-        26: 0,  # 'Ñ…'
-        28: 0,  # 'ц'
-        22: 0,  # 'ч'
-        25: 0,  # 'ш'
-        29: 0,  # 'щ'
-        54: 0,  # 'ÑŠ'
-        18: 1,  # 'Ñ‹'
-        17: 0,  # 'ь'
-        30: 0,  # 'Ñ'
-        27: 0,  # 'ÑŽ'
-        16: 1,  # 'Ñ'
-    },
-    42: {  # 'И'
-        37: 1,  # 'Ð'
-        44: 1,  # 'Б'
-        33: 1,  # 'Ð’'
-        46: 1,  # 'Г'
-        41: 1,  # 'Д'
-        48: 2,  # 'Е'
-        56: 1,  # 'Ж'
-        51: 1,  # 'З'
-        42: 1,  # 'И'
-        60: 1,  # 'Й'
-        36: 1,  # 'К'
-        49: 1,  # 'Л'
-        38: 1,  # 'М'
-        31: 1,  # 'Ð'
-        34: 1,  # 'О'
-        35: 1,  # 'П'
-        45: 1,  # 'Р'
-        32: 2,  # 'С'
-        40: 1,  # 'Т'
-        52: 0,  # 'У'
-        53: 1,  # 'Ф'
-        55: 1,  # 'Ð¥'
-        58: 1,  # 'Ц'
-        50: 1,  # 'Ч'
-        57: 0,  # 'Ш'
-        63: 1,  # 'Щ'
-        62: 0,  # 'Ы'
-        61: 0,  # 'Ь'
-        47: 0,  # 'Э'
-        59: 1,  # 'Ю'
-        43: 1,  # 'Я'
-        3: 1,  # 'а'
-        21: 2,  # 'б'
-        10: 2,  # 'в'
-        19: 2,  # 'г'
-        13: 2,  # 'д'
-        2: 2,  # 'е'
-        24: 0,  # 'ж'
-        20: 2,  # 'з'
-        4: 1,  # 'и'
-        23: 0,  # 'й'
-        11: 1,  # 'к'
-        8: 2,  # 'л'
-        12: 2,  # 'м'
-        5: 2,  # 'н'
-        1: 1,  # 'о'
-        15: 1,  # 'п'
-        9: 2,  # 'Ñ€'
-        7: 2,  # 'Ñ'
-        6: 2,  # 'Ñ‚'
-        14: 1,  # 'у'
-        39: 1,  # 'Ñ„'
-        26: 2,  # 'Ñ…'
-        28: 0,  # 'ц'
-        22: 0,  # 'ч'
-        25: 1,  # 'ш'
-        29: 1,  # 'щ'
-        54: 0,  # 'ÑŠ'
-        18: 0,  # 'Ñ‹'
-        17: 0,  # 'ь'
-        30: 0,  # 'Ñ'
-        27: 1,  # 'ÑŽ'
-        16: 0,  # 'Ñ'
-    },
-    60: {  # 'Й'
-        37: 0,  # 'Ð'
-        44: 0,  # 'Б'
-        33: 0,  # 'Ð’'
-        46: 0,  # 'Г'
-        41: 1,  # 'Д'
-        48: 0,  # 'Е'
-        56: 0,  # 'Ж'
-        51: 0,  # 'З'
-        42: 0,  # 'И'
-        60: 0,  # 'Й'
-        36: 1,  # 'К'
-        49: 1,  # 'Л'
-        38: 0,  # 'М'
-        31: 1,  # 'Ð'
-        34: 0,  # 'О'
-        35: 0,  # 'П'
-        45: 0,  # 'Р'
-        32: 1,  # 'С'
-        40: 1,  # 'Т'
-        52: 0,  # 'У'
-        53: 0,  # 'Ф'
-        55: 1,  # 'Ð¥'
-        58: 1,  # 'Ц'
-        50: 0,  # 'Ч'
-        57: 0,  # 'Ш'
-        63: 0,  # 'Щ'
-        62: 0,  # 'Ы'
-        61: 0,  # 'Ь'
-        47: 0,  # 'Э'
-        59: 0,  # 'Ю'
-        43: 0,  # 'Я'
-        3: 0,  # 'а'
-        21: 0,  # 'б'
-        10: 0,  # 'в'
-        19: 0,  # 'г'
-        13: 0,  # 'д'
-        2: 1,  # 'е'
-        24: 0,  # 'ж'
-        20: 0,  # 'з'
-        4: 0,  # 'и'
-        23: 0,  # 'й'
-        11: 0,  # 'к'
-        8: 0,  # 'л'
-        12: 0,  # 'м'
-        5: 0,  # 'н'
-        1: 2,  # 'о'
-        15: 0,  # 'п'
-        9: 0,  # 'Ñ€'
-        7: 0,  # 'Ñ'
-        6: 0,  # 'Ñ‚'
-        14: 0,  # 'у'
-        39: 0,  # 'Ñ„'
-        26: 0,  # 'Ñ…'
-        28: 0,  # 'ц'
-        22: 0,  # 'ч'
-        25: 0,  # 'ш'
-        29: 0,  # 'щ'
-        54: 0,  # 'ÑŠ'
-        18: 0,  # 'Ñ‹'
-        17: 0,  # 'ь'
-        30: 0,  # 'Ñ'
-        27: 0,  # 'ÑŽ'
-        16: 0,  # 'Ñ'
-    },
-    36: {  # 'К'
-        37: 2,  # 'Ð'
-        44: 0,  # 'Б'
-        33: 1,  # 'Ð’'
-        46: 0,  # 'Г'
-        41: 0,  # 'Д'
-        48: 1,  # 'Е'
-        56: 0,  # 'Ж'
-        51: 1,  # 'З'
-        42: 1,  # 'И'
-        60: 0,  # 'Й'
-        36: 0,  # 'К'
-        49: 1,  # 'Л'
-        38: 0,  # 'М'
-        31: 1,  # 'Ð'
-        34: 2,  # 'О'
-        35: 1,  # 'П'
-        45: 1,  # 'Р'
-        32: 1,  # 'С'
-        40: 1,  # 'Т'
-        52: 1,  # 'У'
-        53: 0,  # 'Ф'
-        55: 0,  # 'Ð¥'
-        58: 1,  # 'Ц'
-        50: 0,  # 'Ч'
-        57: 0,  # 'Ш'
-        63: 0,  # 'Щ'
-        62: 0,  # 'Ы'
-        61: 0,  # 'Ь'
-        47: 0,  # 'Э'
-        59: 0,  # 'Ю'
-        43: 0,  # 'Я'
-        3: 3,  # 'а'
-        21: 0,  # 'б'
-        10: 1,  # 'в'
-        19: 0,  # 'г'
-        13: 0,  # 'д'
-        2: 2,  # 'е'
-        24: 0,  # 'ж'
-        20: 0,  # 'з'
-        4: 2,  # 'и'
-        23: 0,  # 'й'
-        11: 0,  # 'к'
-        8: 2,  # 'л'
-        12: 0,  # 'м'
-        5: 1,  # 'н'
-        1: 3,  # 'о'
-        15: 0,  # 'п'
-        9: 2,  # 'Ñ€'
-        7: 2,  # 'Ñ'
-        6: 2,  # 'Ñ‚'
-        14: 2,  # 'у'
-        39: 0,  # 'Ñ„'
-        26: 1,  # 'Ñ…'
-        28: 0,  # 'ц'
-        22: 0,  # 'ч'
-        25: 0,  # 'ш'
-        29: 0,  # 'щ'
-        54: 0,  # 'ÑŠ'
-        18: 1,  # 'Ñ‹'
-        17: 1,  # 'ь'
-        30: 2,  # 'Ñ'
-        27: 1,  # 'ÑŽ'
-        16: 0,  # 'Ñ'
-    },
-    49: {  # 'Л'
-        37: 2,  # 'Ð'
-        44: 0,  # 'Б'
-        33: 0,  # 'Ð’'
-        46: 1,  # 'Г'
-        41: 0,  # 'Д'
-        48: 1,  # 'Е'
-        56: 1,  # 'Ж'
-        51: 0,  # 'З'
-        42: 1,  # 'И'
-        60: 0,  # 'Й'
-        36: 1,  # 'К'
-        49: 1,  # 'Л'
-        38: 1,  # 'М'
-        31: 0,  # 'Ð'
-        34: 1,  # 'О'
-        35: 1,  # 'П'
-        45: 0,  # 'Р'
-        32: 1,  # 'С'
-        40: 1,  # 'Т'
-        52: 1,  # 'У'
-        53: 0,  # 'Ф'
-        55: 0,  # 'Ð¥'
-        58: 0,  # 'Ц'
-        50: 1,  # 'Ч'
-        57: 0,  # 'Ш'
-        63: 0,  # 'Щ'
-        62: 1,  # 'Ы'
-        61: 1,  # 'Ь'
-        47: 0,  # 'Э'
-        59: 1,  # 'Ю'
-        43: 1,  # 'Я'
-        3: 2,  # 'а'
-        21: 0,  # 'б'
-        10: 0,  # 'в'
-        19: 1,  # 'г'
-        13: 0,  # 'д'
-        2: 2,  # 'е'
-        24: 1,  # 'ж'
-        20: 0,  # 'з'
-        4: 2,  # 'и'
-        23: 0,  # 'й'
-        11: 0,  # 'к'
-        8: 1,  # 'л'
-        12: 0,  # 'м'
-        5: 1,  # 'н'
-        1: 2,  # 'о'
-        15: 0,  # 'п'
-        9: 0,  # 'Ñ€'
-        7: 0,  # 'Ñ'
-        6: 0,  # 'Ñ‚'
-        14: 2,  # 'у'
-        39: 0,  # 'Ñ„'
-        26: 1,  # 'Ñ…'
-        28: 0,  # 'ц'
-        22: 0,  # 'ч'
-        25: 0,  # 'ш'
-        29: 0,  # 'щ'
-        54: 0,  # 'ÑŠ'
-        18: 1,  # 'Ñ‹'
-        17: 1,  # 'ь'
-        30: 2,  # 'Ñ'
-        27: 2,  # 'ÑŽ'
-        16: 1,  # 'Ñ'
-    },
-    38: {  # 'М'
-        37: 1,  # 'Ð'
-        44: 1,  # 'Б'
-        33: 1,  # 'Ð’'
-        46: 0,  # 'Г'
-        41: 0,  # 'Д'
-        48: 1,  # 'Е'
-        56: 0,  # 'Ж'
-        51: 0,  # 'З'
-        42: 1,  # 'И'
-        60: 0,  # 'Й'
-        36: 1,  # 'К'
-        49: 1,  # 'Л'
-        38: 1,  # 'М'
-        31: 1,  # 'Ð'
-        34: 1,  # 'О'
-        35: 1,  # 'П'
-        45: 1,  # 'Р'
-        32: 1,  # 'С'
-        40: 1,  # 'Т'
-        52: 1,  # 'У'
-        53: 1,  # 'Ф'
-        55: 1,  # 'Ð¥'
-        58: 0,  # 'Ц'
-        50: 0,  # 'Ч'
-        57: 0,  # 'Ш'
-        63: 0,  # 'Щ'
-        62: 1,  # 'Ы'
-        61: 0,  # 'Ь'
-        47: 1,  # 'Э'
-        59: 0,  # 'Ю'
-        43: 1,  # 'Я'
-        3: 3,  # 'а'
-        21: 0,  # 'б'
-        10: 0,  # 'в'
-        19: 1,  # 'г'
-        13: 0,  # 'д'
-        2: 2,  # 'е'
-        24: 0,  # 'ж'
-        20: 0,  # 'з'
-        4: 3,  # 'и'
-        23: 0,  # 'й'
-        11: 0,  # 'к'
-        8: 1,  # 'л'
-        12: 1,  # 'м'
-        5: 2,  # 'н'
-        1: 3,  # 'о'
-        15: 0,  # 'п'
-        9: 1,  # 'Ñ€'
-        7: 1,  # 'Ñ'
-        6: 0,  # 'Ñ‚'
-        14: 2,  # 'у'
-        39: 0,  # 'Ñ„'
-        26: 0,  # 'Ñ…'
-        28: 0,  # 'ц'
-        22: 0,  # 'ч'
-        25: 0,  # 'ш'
-        29: 0,  # 'щ'
-        54: 0,  # 'ÑŠ'
-        18: 3,  # 'Ñ‹'
-        17: 1,  # 'ь'
-        30: 2,  # 'Ñ'
-        27: 1,  # 'ÑŽ'
-        16: 1,  # 'Ñ'
-    },
-    31: {  # 'Ð'
-        37: 2,  # 'Ð'
-        44: 0,  # 'Б'
-        33: 0,  # 'Ð’'
-        46: 1,  # 'Г'
-        41: 1,  # 'Д'
-        48: 1,  # 'Е'
-        56: 0,  # 'Ж'
-        51: 1,  # 'З'
-        42: 2,  # 'И'
-        60: 0,  # 'Й'
-        36: 1,  # 'К'
-        49: 0,  # 'Л'
-        38: 0,  # 'М'
-        31: 1,  # 'Ð'
-        34: 1,  # 'О'
-        35: 0,  # 'П'
-        45: 1,  # 'Р'
-        32: 1,  # 'С'
-        40: 1,  # 'Т'
-        52: 1,  # 'У'
-        53: 1,  # 'Ф'
-        55: 1,  # 'Ð¥'
-        58: 1,  # 'Ц'
-        50: 1,  # 'Ч'
-        57: 0,  # 'Ш'
-        63: 0,  # 'Щ'
-        62: 1,  # 'Ы'
-        61: 1,  # 'Ь'
-        47: 1,  # 'Э'
-        59: 0,  # 'Ю'
-        43: 1,  # 'Я'
-        3: 3,  # 'а'
-        21: 0,  # 'б'
-        10: 0,  # 'в'
-        19: 0,  # 'г'
-        13: 0,  # 'д'
-        2: 3,  # 'е'
-        24: 0,  # 'ж'
-        20: 0,  # 'з'
-        4: 3,  # 'и'
-        23: 0,  # 'й'
-        11: 0,  # 'к'
-        8: 0,  # 'л'
-        12: 0,  # 'м'
-        5: 0,  # 'н'
-        1: 3,  # 'о'
-        15: 0,  # 'п'
-        9: 1,  # 'Ñ€'
-        7: 0,  # 'Ñ'
-        6: 0,  # 'Ñ‚'
-        14: 3,  # 'у'
-        39: 0,  # 'Ñ„'
-        26: 1,  # 'Ñ…'
-        28: 0,  # 'ц'
-        22: 0,  # 'ч'
-        25: 0,  # 'ш'
-        29: 0,  # 'щ'
-        54: 0,  # 'ÑŠ'
-        18: 1,  # 'Ñ‹'
-        17: 2,  # 'ь'
-        30: 1,  # 'Ñ'
-        27: 1,  # 'ÑŽ'
-        16: 1,  # 'Ñ'
-    },
-    34: {  # 'О'
-        37: 0,  # 'Ð'
-        44: 1,  # 'Б'
-        33: 1,  # 'Ð’'
-        46: 1,  # 'Г'
-        41: 2,  # 'Д'
-        48: 1,  # 'Е'
-        56: 1,  # 'Ж'
-        51: 1,  # 'З'
-        42: 1,  # 'И'
-        60: 1,  # 'Й'
-        36: 1,  # 'К'
-        49: 2,  # 'Л'
-        38: 1,  # 'М'
-        31: 2,  # 'Ð'
-        34: 1,  # 'О'
-        35: 1,  # 'П'
-        45: 2,  # 'Р'
-        32: 1,  # 'С'
-        40: 1,  # 'Т'
-        52: 1,  # 'У'
-        53: 1,  # 'Ф'
-        55: 1,  # 'Ð¥'
-        58: 0,  # 'Ц'
-        50: 1,  # 'Ч'
-        57: 1,  # 'Ш'
-        63: 1,  # 'Щ'
-        62: 0,  # 'Ы'
-        61: 0,  # 'Ь'
-        47: 0,  # 'Э'
-        59: 0,  # 'Ю'
-        43: 1,  # 'Я'
-        3: 1,  # 'а'
-        21: 2,  # 'б'
-        10: 1,  # 'в'
-        19: 2,  # 'г'
-        13: 2,  # 'д'
-        2: 0,  # 'е'
-        24: 1,  # 'ж'
-        20: 1,  # 'з'
-        4: 0,  # 'и'
-        23: 1,  # 'й'
-        11: 2,  # 'к'
-        8: 2,  # 'л'
-        12: 1,  # 'м'
-        5: 3,  # 'н'
-        1: 0,  # 'о'
-        15: 2,  # 'п'
-        9: 2,  # 'Ñ€'
-        7: 2,  # 'Ñ'
-        6: 2,  # 'Ñ‚'
-        14: 1,  # 'у'
-        39: 1,  # 'Ñ„'
-        26: 2,  # 'Ñ…'
-        28: 1,  # 'ц'
-        22: 2,  # 'ч'
-        25: 2,  # 'ш'
-        29: 1,  # 'щ'
-        54: 0,  # 'ÑŠ'
-        18: 0,  # 'Ñ‹'
-        17: 0,  # 'ь'
-        30: 0,  # 'Ñ'
-        27: 0,  # 'ÑŽ'
-        16: 0,  # 'Ñ'
-    },
-    35: {  # 'П'
-        37: 1,  # 'Ð'
-        44: 0,  # 'Б'
-        33: 0,  # 'Ð’'
-        46: 0,  # 'Г'
-        41: 0,  # 'Д'
-        48: 1,  # 'Е'
-        56: 0,  # 'Ж'
-        51: 0,  # 'З'
-        42: 1,  # 'И'
-        60: 0,  # 'Й'
-        36: 0,  # 'К'
-        49: 1,  # 'Л'
-        38: 0,  # 'М'
-        31: 1,  # 'Ð'
-        34: 1,  # 'О'
-        35: 1,  # 'П'
-        45: 2,  # 'Р'
-        32: 1,  # 'С'
-        40: 1,  # 'Т'
-        52: 1,  # 'У'
-        53: 0,  # 'Ф'
-        55: 0,  # 'Ð¥'
-        58: 0,  # 'Ц'
-        50: 0,  # 'Ч'
-        57: 0,  # 'Ш'
-        63: 0,  # 'Щ'
-        62: 1,  # 'Ы'
-        61: 1,  # 'Ь'
-        47: 0,  # 'Э'
-        59: 0,  # 'Ю'
-        43: 1,  # 'Я'
-        3: 2,  # 'а'
-        21: 0,  # 'б'
-        10: 0,  # 'в'
-        19: 0,  # 'г'
-        13: 0,  # 'д'
-        2: 2,  # 'е'
-        24: 0,  # 'ж'
-        20: 0,  # 'з'
-        4: 2,  # 'и'
-        23: 0,  # 'й'
-        11: 0,  # 'к'
-        8: 2,  # 'л'
-        12: 0,  # 'м'
-        5: 1,  # 'н'
-        1: 3,  # 'о'
-        15: 0,  # 'п'
-        9: 3,  # 'Ñ€'
-        7: 1,  # 'Ñ'
-        6: 1,  # 'Ñ‚'
-        14: 2,  # 'у'
-        39: 1,  # 'Ñ„'
-        26: 0,  # 'Ñ…'
-        28: 0,  # 'ц'
-        22: 0,  # 'ч'
-        25: 1,  # 'ш'
-        29: 0,  # 'щ'
-        54: 0,  # 'ÑŠ'
-        18: 1,  # 'Ñ‹'
-        17: 2,  # 'ь'
-        30: 1,  # 'Ñ'
-        27: 0,  # 'ÑŽ'
-        16: 2,  # 'Ñ'
-    },
-    45: {  # 'Р'
-        37: 2,  # 'Ð'
-        44: 1,  # 'Б'
-        33: 1,  # 'Ð’'
-        46: 1,  # 'Г'
-        41: 1,  # 'Д'
-        48: 2,  # 'Е'
-        56: 1,  # 'Ж'
-        51: 0,  # 'З'
-        42: 2,  # 'И'
-        60: 0,  # 'Й'
-        36: 1,  # 'К'
-        49: 1,  # 'Л'
-        38: 1,  # 'М'
-        31: 1,  # 'Ð'
-        34: 2,  # 'О'
-        35: 0,  # 'П'
-        45: 1,  # 'Р'
-        32: 1,  # 'С'
-        40: 1,  # 'Т'
-        52: 1,  # 'У'
-        53: 0,  # 'Ф'
-        55: 1,  # 'Ð¥'
-        58: 1,  # 'Ц'
-        50: 1,  # 'Ч'
-        57: 1,  # 'Ш'
-        63: 0,  # 'Щ'
-        62: 1,  # 'Ы'
-        61: 1,  # 'Ь'
-        47: 1,  # 'Э'
-        59: 1,  # 'Ю'
-        43: 1,  # 'Я'
-        3: 3,  # 'а'
-        21: 0,  # 'б'
-        10: 1,  # 'в'
-        19: 0,  # 'г'
-        13: 0,  # 'д'
-        2: 2,  # 'е'
-        24: 1,  # 'ж'
-        20: 0,  # 'з'
-        4: 2,  # 'и'
-        23: 0,  # 'й'
-        11: 0,  # 'к'
-        8: 0,  # 'л'
-        12: 0,  # 'м'
-        5: 0,  # 'н'
-        1: 3,  # 'о'
-        15: 0,  # 'п'
-        9: 1,  # 'Ñ€'
-        7: 0,  # 'Ñ'
-        6: 0,  # 'Ñ‚'
-        14: 2,  # 'у'
-        39: 0,  # 'Ñ„'
-        26: 0,  # 'Ñ…'
-        28: 0,  # 'ц'
-        22: 0,  # 'ч'
-        25: 0,  # 'ш'
-        29: 0,  # 'щ'
-        54: 0,  # 'ÑŠ'
-        18: 2,  # 'Ñ‹'
-        17: 0,  # 'ь'
-        30: 1,  # 'Ñ'
-        27: 1,  # 'ÑŽ'
-        16: 2,  # 'Ñ'
-    },
-    32: {  # 'С'
-        37: 1,  # 'Ð'
-        44: 1,  # 'Б'
-        33: 1,  # 'Ð’'
-        46: 1,  # 'Г'
-        41: 1,  # 'Д'
-        48: 1,  # 'Е'
-        56: 0,  # 'Ж'
-        51: 0,  # 'З'
-        42: 1,  # 'И'
-        60: 0,  # 'Й'
-        36: 1,  # 'К'
-        49: 1,  # 'Л'
-        38: 1,  # 'М'
-        31: 1,  # 'Ð'
-        34: 1,  # 'О'
-        35: 1,  # 'П'
-        45: 1,  # 'Р'
-        32: 1,  # 'С'
-        40: 2,  # 'Т'
-        52: 1,  # 'У'
-        53: 0,  # 'Ф'
-        55: 1,  # 'Ð¥'
-        58: 1,  # 'Ц'
-        50: 1,  # 'Ч'
-        57: 1,  # 'Ш'
-        63: 0,  # 'Щ'
-        62: 1,  # 'Ы'
-        61: 1,  # 'Ь'
-        47: 1,  # 'Э'
-        59: 1,  # 'Ю'
-        43: 1,  # 'Я'
-        3: 2,  # 'а'
-        21: 1,  # 'б'
-        10: 2,  # 'в'
-        19: 1,  # 'г'
-        13: 2,  # 'д'
-        2: 3,  # 'е'
-        24: 1,  # 'ж'
-        20: 1,  # 'з'
-        4: 2,  # 'и'
-        23: 0,  # 'й'
-        11: 2,  # 'к'
-        8: 2,  # 'л'
-        12: 2,  # 'м'
-        5: 2,  # 'н'
-        1: 2,  # 'о'
-        15: 2,  # 'п'
-        9: 2,  # 'Ñ€'
-        7: 1,  # 'Ñ'
-        6: 3,  # 'Ñ‚'
-        14: 2,  # 'у'
-        39: 1,  # 'Ñ„'
-        26: 1,  # 'Ñ…'
-        28: 1,  # 'ц'
-        22: 1,  # 'ч'
-        25: 0,  # 'ш'
-        29: 0,  # 'щ'
-        54: 1,  # 'ÑŠ'
-        18: 1,  # 'Ñ‹'
-        17: 1,  # 'ь'
-        30: 2,  # 'Ñ'
-        27: 1,  # 'ÑŽ'
-        16: 1,  # 'Ñ'
-    },
-    40: {  # 'Т'
-        37: 1,  # 'Ð'
-        44: 0,  # 'Б'
-        33: 1,  # 'Ð’'
-        46: 0,  # 'Г'
-        41: 0,  # 'Д'
-        48: 1,  # 'Е'
-        56: 0,  # 'Ж'
-        51: 0,  # 'З'
-        42: 1,  # 'И'
-        60: 0,  # 'Й'
-        36: 1,  # 'К'
-        49: 1,  # 'Л'
-        38: 1,  # 'М'
-        31: 1,  # 'Ð'
-        34: 2,  # 'О'
-        35: 0,  # 'П'
-        45: 1,  # 'Р'
-        32: 1,  # 'С'
-        40: 1,  # 'Т'
-        52: 1,  # 'У'
-        53: 0,  # 'Ф'
-        55: 0,  # 'Ð¥'
-        58: 0,  # 'Ц'
-        50: 1,  # 'Ч'
-        57: 0,  # 'Ш'
-        63: 0,  # 'Щ'
-        62: 1,  # 'Ы'
-        61: 1,  # 'Ь'
-        47: 1,  # 'Э'
-        59: 1,  # 'Ю'
-        43: 1,  # 'Я'
-        3: 3,  # 'а'
-        21: 1,  # 'б'
-        10: 2,  # 'в'
-        19: 0,  # 'г'
-        13: 0,  # 'д'
-        2: 3,  # 'е'
-        24: 0,  # 'ж'
-        20: 0,  # 'з'
-        4: 2,  # 'и'
-        23: 0,  # 'й'
-        11: 1,  # 'к'
-        8: 1,  # 'л'
-        12: 0,  # 'м'
-        5: 0,  # 'н'
-        1: 3,  # 'о'
-        15: 0,  # 'п'
-        9: 2,  # 'Ñ€'
-        7: 1,  # 'Ñ'
-        6: 0,  # 'Ñ‚'
-        14: 2,  # 'у'
-        39: 0,  # 'Ñ„'
-        26: 0,  # 'Ñ…'
-        28: 0,  # 'ц'
-        22: 0,  # 'ч'
-        25: 0,  # 'ш'
-        29: 1,  # 'щ'
-        54: 0,  # 'ÑŠ'
-        18: 3,  # 'Ñ‹'
-        17: 1,  # 'ь'
-        30: 2,  # 'Ñ'
-        27: 1,  # 'ÑŽ'
-        16: 1,  # 'Ñ'
-    },
-    52: {  # 'У'
-        37: 1,  # 'Ð'
-        44: 1,  # 'Б'
-        33: 1,  # 'Ð’'
-        46: 1,  # 'Г'
-        41: 1,  # 'Д'
-        48: 1,  # 'Е'
-        56: 1,  # 'Ж'
-        51: 0,  # 'З'
-        42: 0,  # 'И'
-        60: 1,  # 'Й'
-        36: 1,  # 'К'
-        49: 1,  # 'Л'
-        38: 1,  # 'М'
-        31: 1,  # 'Ð'
-        34: 1,  # 'О'
-        35: 1,  # 'П'
-        45: 1,  # 'Р'
-        32: 1,  # 'С'
-        40: 1,  # 'Т'
-        52: 0,  # 'У'
-        53: 0,  # 'Ф'
-        55: 1,  # 'Ð¥'
-        58: 0,  # 'Ц'
-        50: 1,  # 'Ч'
-        57: 1,  # 'Ш'
-        63: 1,  # 'Щ'
-        62: 0,  # 'Ы'
-        61: 0,  # 'Ь'
-        47: 0,  # 'Э'
-        59: 1,  # 'Ю'
-        43: 0,  # 'Я'
-        3: 1,  # 'а'
-        21: 2,  # 'б'
-        10: 2,  # 'в'
-        19: 1,  # 'г'
-        13: 2,  # 'д'
-        2: 1,  # 'е'
-        24: 2,  # 'ж'
-        20: 2,  # 'з'
-        4: 2,  # 'и'
-        23: 1,  # 'й'
-        11: 1,  # 'к'
-        8: 2,  # 'л'
-        12: 2,  # 'м'
-        5: 1,  # 'н'
-        1: 2,  # 'о'
-        15: 1,  # 'п'
-        9: 2,  # 'Ñ€'
-        7: 2,  # 'Ñ'
-        6: 2,  # 'Ñ‚'
-        14: 0,  # 'у'
-        39: 1,  # 'Ñ„'
-        26: 1,  # 'Ñ…'
-        28: 1,  # 'ц'
-        22: 2,  # 'ч'
-        25: 1,  # 'ш'
-        29: 1,  # 'щ'
-        54: 0,  # 'ÑŠ'
-        18: 0,  # 'Ñ‹'
-        17: 0,  # 'ь'
-        30: 2,  # 'Ñ'
-        27: 1,  # 'ÑŽ'
-        16: 0,  # 'Ñ'
-    },
-    53: {  # 'Ф'
-        37: 1,  # 'Ð'
-        44: 1,  # 'Б'
-        33: 0,  # 'Ð’'
-        46: 0,  # 'Г'
-        41: 0,  # 'Д'
-        48: 1,  # 'Е'
-        56: 0,  # 'Ж'
-        51: 0,  # 'З'
-        42: 1,  # 'И'
-        60: 0,  # 'Й'
-        36: 0,  # 'К'
-        49: 1,  # 'Л'
-        38: 0,  # 'М'
-        31: 0,  # 'Ð'
-        34: 1,  # 'О'
-        35: 0,  # 'П'
-        45: 1,  # 'Р'
-        32: 0,  # 'С'
-        40: 0,  # 'Т'
-        52: 1,  # 'У'
-        53: 0,  # 'Ф'
-        55: 0,  # 'Ð¥'
-        58: 0,  # 'Ц'
-        50: 0,  # 'Ч'
-        57: 0,  # 'Ш'
-        63: 0,  # 'Щ'
-        62: 0,  # 'Ы'
-        61: 0,  # 'Ь'
-        47: 0,  # 'Э'
-        59: 0,  # 'Ю'
-        43: 0,  # 'Я'
-        3: 2,  # 'а'
-        21: 0,  # 'б'
-        10: 0,  # 'в'
-        19: 0,  # 'г'
-        13: 0,  # 'д'
-        2: 2,  # 'е'
-        24: 0,  # 'ж'
-        20: 0,  # 'з'
-        4: 2,  # 'и'
-        23: 0,  # 'й'
-        11: 0,  # 'к'
-        8: 2,  # 'л'
-        12: 0,  # 'м'
-        5: 0,  # 'н'
-        1: 2,  # 'о'
-        15: 0,  # 'п'
-        9: 2,  # 'Ñ€'
-        7: 0,  # 'Ñ'
-        6: 1,  # 'Ñ‚'
-        14: 2,  # 'у'
-        39: 0,  # 'Ñ„'
-        26: 0,  # 'Ñ…'
-        28: 0,  # 'ц'
-        22: 0,  # 'ч'
-        25: 0,  # 'ш'
-        29: 0,  # 'щ'
-        54: 0,  # 'ÑŠ'
-        18: 0,  # 'Ñ‹'
-        17: 1,  # 'ь'
-        30: 2,  # 'Ñ'
-        27: 0,  # 'ÑŽ'
-        16: 0,  # 'Ñ'
-    },
-    55: {  # 'Ð¥'
-        37: 1,  # 'Ð'
-        44: 0,  # 'Б'
-        33: 1,  # 'Ð’'
-        46: 0,  # 'Г'
-        41: 0,  # 'Д'
-        48: 0,  # 'Е'
-        56: 0,  # 'Ж'
-        51: 0,  # 'З'
-        42: 1,  # 'И'
-        60: 0,  # 'Й'
-        36: 0,  # 'К'
-        49: 1,  # 'Л'
-        38: 1,  # 'М'
-        31: 1,  # 'Ð'
-        34: 1,  # 'О'
-        35: 0,  # 'П'
-        45: 0,  # 'Р'
-        32: 0,  # 'С'
-        40: 0,  # 'Т'
-        52: 0,  # 'У'
-        53: 0,  # 'Ф'
-        55: 0,  # 'Ð¥'
-        58: 0,  # 'Ц'
-        50: 0,  # 'Ч'
-        57: 0,  # 'Ш'
-        63: 0,  # 'Щ'
-        62: 0,  # 'Ы'
-        61: 0,  # 'Ь'
-        47: 0,  # 'Э'
-        59: 0,  # 'Ю'
-        43: 0,  # 'Я'
-        3: 2,  # 'а'
-        21: 0,  # 'б'
-        10: 2,  # 'в'
-        19: 0,  # 'г'
-        13: 0,  # 'д'
-        2: 2,  # 'е'
-        24: 0,  # 'ж'
-        20: 0,  # 'з'
-        4: 2,  # 'и'
-        23: 0,  # 'й'
-        11: 0,  # 'к'
-        8: 2,  # 'л'
-        12: 1,  # 'м'
-        5: 0,  # 'н'
-        1: 2,  # 'о'
-        15: 0,  # 'п'
-        9: 2,  # 'Ñ€'
-        7: 0,  # 'Ñ'
-        6: 0,  # 'Ñ‚'
-        14: 1,  # 'у'
-        39: 0,  # 'Ñ„'
-        26: 0,  # 'Ñ…'
-        28: 0,  # 'ц'
-        22: 0,  # 'ч'
-        25: 0,  # 'ш'
-        29: 0,  # 'щ'
-        54: 0,  # 'ÑŠ'
-        18: 0,  # 'Ñ‹'
-        17: 1,  # 'ь'
-        30: 1,  # 'Ñ'
-        27: 0,  # 'ÑŽ'
-        16: 0,  # 'Ñ'
-    },
-    58: {  # 'Ц'
-        37: 1,  # 'Ð'
-        44: 0,  # 'Б'
-        33: 0,  # 'Ð’'
-        46: 0,  # 'Г'
-        41: 0,  # 'Д'
-        48: 1,  # 'Е'
-        56: 0,  # 'Ж'
-        51: 0,  # 'З'
-        42: 1,  # 'И'
-        60: 0,  # 'Й'
-        36: 1,  # 'К'
-        49: 0,  # 'Л'
-        38: 0,  # 'М'
-        31: 0,  # 'Ð'
-        34: 1,  # 'О'
-        35: 0,  # 'П'
-        45: 0,  # 'Р'
-        32: 0,  # 'С'
-        40: 0,  # 'Т'
-        52: 1,  # 'У'
-        53: 0,  # 'Ф'
-        55: 0,  # 'Ð¥'
-        58: 0,  # 'Ц'
-        50: 0,  # 'Ч'
-        57: 0,  # 'Ш'
-        63: 0,  # 'Щ'
-        62: 1,  # 'Ы'
-        61: 0,  # 'Ь'
-        47: 0,  # 'Э'
-        59: 0,  # 'Ю'
-        43: 0,  # 'Я'
-        3: 1,  # 'а'
-        21: 0,  # 'б'
-        10: 1,  # 'в'
-        19: 0,  # 'г'
-        13: 0,  # 'д'
-        2: 2,  # 'е'
-        24: 0,  # 'ж'
-        20: 0,  # 'з'
-        4: 2,  # 'и'
-        23: 0,  # 'й'
-        11: 0,  # 'к'
-        8: 0,  # 'л'
-        12: 0,  # 'м'
-        5: 0,  # 'н'
-        1: 0,  # 'о'
-        15: 0,  # 'п'
-        9: 0,  # 'Ñ€'
-        7: 0,  # 'Ñ'
-        6: 0,  # 'Ñ‚'
-        14: 1,  # 'у'
-        39: 0,  # 'Ñ„'
-        26: 0,  # 'Ñ…'
-        28: 0,  # 'ц'
-        22: 0,  # 'ч'
-        25: 0,  # 'ш'
-        29: 0,  # 'щ'
-        54: 0,  # 'ÑŠ'
-        18: 1,  # 'Ñ‹'
-        17: 0,  # 'ь'
-        30: 0,  # 'Ñ'
-        27: 1,  # 'ÑŽ'
-        16: 0,  # 'Ñ'
-    },
-    50: {  # 'Ч'
-        37: 1,  # 'Ð'
-        44: 0,  # 'Б'
-        33: 0,  # 'Ð’'
-        46: 0,  # 'Г'
-        41: 0,  # 'Д'
-        48: 1,  # 'Е'
-        56: 0,  # 'Ж'
-        51: 0,  # 'З'
-        42: 1,  # 'И'
-        60: 0,  # 'Й'
-        36: 1,  # 'К'
-        49: 0,  # 'Л'
-        38: 0,  # 'М'
-        31: 1,  # 'Ð'
-        34: 0,  # 'О'
-        35: 1,  # 'П'
-        45: 0,  # 'Р'
-        32: 0,  # 'С'
-        40: 1,  # 'Т'
-        52: 1,  # 'У'
-        53: 0,  # 'Ф'
-        55: 0,  # 'Ð¥'
-        58: 0,  # 'Ц'
-        50: 0,  # 'Ч'
-        57: 0,  # 'Ш'
-        63: 0,  # 'Щ'
-        62: 0,  # 'Ы'
-        61: 1,  # 'Ь'
-        47: 0,  # 'Э'
-        59: 0,  # 'Ю'
-        43: 0,  # 'Я'
-        3: 2,  # 'а'
-        21: 0,  # 'б'
-        10: 0,  # 'в'
-        19: 0,  # 'г'
-        13: 0,  # 'д'
-        2: 2,  # 'е'
-        24: 0,  # 'ж'
-        20: 0,  # 'з'
-        4: 2,  # 'и'
-        23: 0,  # 'й'
-        11: 0,  # 'к'
-        8: 1,  # 'л'
-        12: 0,  # 'м'
-        5: 0,  # 'н'
-        1: 1,  # 'о'
-        15: 0,  # 'п'
-        9: 1,  # 'Ñ€'
-        7: 0,  # 'Ñ'
-        6: 3,  # 'Ñ‚'
-        14: 2,  # 'у'
-        39: 0,  # 'Ñ„'
-        26: 0,  # 'Ñ…'
-        28: 0,  # 'ц'
-        22: 0,  # 'ч'
-        25: 0,  # 'ш'
-        29: 0,  # 'щ'
-        54: 0,  # 'ÑŠ'
-        18: 0,  # 'Ñ‹'
-        17: 1,  # 'ь'
-        30: 0,  # 'Ñ'
-        27: 0,  # 'ÑŽ'
-        16: 0,  # 'Ñ'
-    },
-    57: {  # 'Ш'
-        37: 1,  # 'Ð'
-        44: 0,  # 'Б'
-        33: 0,  # 'Ð’'
-        46: 0,  # 'Г'
-        41: 0,  # 'Д'
-        48: 1,  # 'Е'
-        56: 0,  # 'Ж'
-        51: 0,  # 'З'
-        42: 1,  # 'И'
-        60: 0,  # 'Й'
-        36: 1,  # 'К'
-        49: 1,  # 'Л'
-        38: 0,  # 'М'
-        31: 1,  # 'Ð'
-        34: 1,  # 'О'
-        35: 0,  # 'П'
-        45: 0,  # 'Р'
-        32: 0,  # 'С'
-        40: 0,  # 'Т'
-        52: 1,  # 'У'
-        53: 0,  # 'Ф'
-        55: 0,  # 'Ð¥'
-        58: 0,  # 'Ц'
-        50: 0,  # 'Ч'
-        57: 0,  # 'Ш'
-        63: 0,  # 'Щ'
-        62: 0,  # 'Ы'
-        61: 0,  # 'Ь'
-        47: 0,  # 'Э'
-        59: 0,  # 'Ю'
-        43: 0,  # 'Я'
-        3: 2,  # 'а'
-        21: 0,  # 'б'
-        10: 1,  # 'в'
-        19: 0,  # 'г'
-        13: 0,  # 'д'
-        2: 2,  # 'е'
-        24: 0,  # 'ж'
-        20: 0,  # 'з'
-        4: 1,  # 'и'
-        23: 0,  # 'й'
-        11: 1,  # 'к'
-        8: 2,  # 'л'
-        12: 1,  # 'м'
-        5: 1,  # 'н'
-        1: 2,  # 'о'
-        15: 2,  # 'п'
-        9: 1,  # 'Ñ€'
-        7: 0,  # 'Ñ'
-        6: 2,  # 'Ñ‚'
-        14: 2,  # 'у'
-        39: 0,  # 'Ñ„'
-        26: 1,  # 'Ñ…'
-        28: 0,  # 'ц'
-        22: 0,  # 'ч'
-        25: 1,  # 'ш'
-        29: 0,  # 'щ'
-        54: 0,  # 'ÑŠ'
-        18: 0,  # 'Ñ‹'
-        17: 0,  # 'ь'
-        30: 1,  # 'Ñ'
-        27: 0,  # 'ÑŽ'
-        16: 0,  # 'Ñ'
-    },
-    63: {  # 'Щ'
-        37: 1,  # 'Ð'
-        44: 0,  # 'Б'
-        33: 0,  # 'Ð’'
-        46: 0,  # 'Г'
-        41: 0,  # 'Д'
-        48: 1,  # 'Е'
-        56: 0,  # 'Ж'
-        51: 0,  # 'З'
-        42: 1,  # 'И'
-        60: 0,  # 'Й'
-        36: 0,  # 'К'
-        49: 0,  # 'Л'
-        38: 0,  # 'М'
-        31: 0,  # 'Ð'
-        34: 0,  # 'О'
-        35: 0,  # 'П'
-        45: 0,  # 'Р'
-        32: 0,  # 'С'
-        40: 0,  # 'Т'
-        52: 0,  # 'У'
-        53: 0,  # 'Ф'
-        55: 0,  # 'Ð¥'
-        58: 0,  # 'Ц'
-        50: 0,  # 'Ч'
-        57: 0,  # 'Ш'
-        63: 0,  # 'Щ'
-        62: 0,  # 'Ы'
-        61: 1,  # 'Ь'
-        47: 0,  # 'Э'
-        59: 0,  # 'Ю'
-        43: 0,  # 'Я'
-        3: 1,  # 'а'
-        21: 0,  # 'б'
-        10: 0,  # 'в'
-        19: 0,  # 'г'
-        13: 0,  # 'д'
-        2: 1,  # 'е'
-        24: 0,  # 'ж'
-        20: 0,  # 'з'
-        4: 1,  # 'и'
-        23: 0,  # 'й'
-        11: 0,  # 'к'
-        8: 0,  # 'л'
-        12: 0,  # 'м'
-        5: 0,  # 'н'
-        1: 1,  # 'о'
-        15: 0,  # 'п'
-        9: 0,  # 'Ñ€'
-        7: 0,  # 'Ñ'
-        6: 0,  # 'Ñ‚'
-        14: 1,  # 'у'
-        39: 0,  # 'Ñ„'
-        26: 0,  # 'Ñ…'
-        28: 0,  # 'ц'
-        22: 0,  # 'ч'
-        25: 0,  # 'ш'
-        29: 0,  # 'щ'
-        54: 0,  # 'ÑŠ'
-        18: 0,  # 'Ñ‹'
-        17: 0,  # 'ь'
-        30: 0,  # 'Ñ'
-        27: 0,  # 'ÑŽ'
-        16: 0,  # 'Ñ'
-    },
-    62: {  # 'Ы'
-        37: 0,  # 'Ð'
-        44: 0,  # 'Б'
-        33: 1,  # 'Ð’'
-        46: 1,  # 'Г'
-        41: 0,  # 'Д'
-        48: 1,  # 'Е'
-        56: 0,  # 'Ж'
-        51: 0,  # 'З'
-        42: 0,  # 'И'
-        60: 1,  # 'Й'
-        36: 1,  # 'К'
-        49: 1,  # 'Л'
-        38: 1,  # 'М'
-        31: 1,  # 'Ð'
-        34: 0,  # 'О'
-        35: 1,  # 'П'
-        45: 1,  # 'Р'
-        32: 1,  # 'С'
-        40: 1,  # 'Т'
-        52: 0,  # 'У'
-        53: 0,  # 'Ф'
-        55: 1,  # 'Ð¥'
-        58: 1,  # 'Ц'
-        50: 0,  # 'Ч'
-        57: 1,  # 'Ш'
-        63: 0,  # 'Щ'
-        62: 0,  # 'Ы'
-        61: 0,  # 'Ь'
-        47: 0,  # 'Э'
-        59: 0,  # 'Ю'
-        43: 0,  # 'Я'
-        3: 0,  # 'а'
-        21: 0,  # 'б'
-        10: 0,  # 'в'
-        19: 0,  # 'г'
-        13: 0,  # 'д'
-        2: 0,  # 'е'
-        24: 0,  # 'ж'
-        20: 0,  # 'з'
-        4: 0,  # 'и'
-        23: 0,  # 'й'
-        11: 0,  # 'к'
-        8: 0,  # 'л'
-        12: 0,  # 'м'
-        5: 0,  # 'н'
-        1: 0,  # 'о'
-        15: 0,  # 'п'
-        9: 0,  # 'Ñ€'
-        7: 0,  # 'Ñ'
-        6: 0,  # 'Ñ‚'
-        14: 0,  # 'у'
-        39: 0,  # 'Ñ„'
-        26: 0,  # 'Ñ…'
-        28: 0,  # 'ц'
-        22: 0,  # 'ч'
-        25: 0,  # 'ш'
-        29: 0,  # 'щ'
-        54: 0,  # 'ÑŠ'
-        18: 0,  # 'Ñ‹'
-        17: 0,  # 'ь'
-        30: 0,  # 'Ñ'
-        27: 0,  # 'ÑŽ'
-        16: 0,  # 'Ñ'
-    },
-    61: {  # 'Ь'
-        37: 0,  # 'Ð'
-        44: 1,  # 'Б'
-        33: 1,  # 'Ð’'
-        46: 0,  # 'Г'
-        41: 1,  # 'Д'
-        48: 1,  # 'Е'
-        56: 0,  # 'Ж'
-        51: 0,  # 'З'
-        42: 1,  # 'И'
-        60: 0,  # 'Й'
-        36: 1,  # 'К'
-        49: 0,  # 'Л'
-        38: 1,  # 'М'
-        31: 1,  # 'Ð'
-        34: 1,  # 'О'
-        35: 0,  # 'П'
-        45: 0,  # 'Р'
-        32: 1,  # 'С'
-        40: 0,  # 'Т'
-        52: 0,  # 'У'
-        53: 1,  # 'Ф'
-        55: 0,  # 'Ð¥'
-        58: 0,  # 'Ц'
-        50: 0,  # 'Ч'
-        57: 1,  # 'Ш'
-        63: 0,  # 'Щ'
-        62: 0,  # 'Ы'
-        61: 0,  # 'Ь'
-        47: 0,  # 'Э'
-        59: 1,  # 'Ю'
-        43: 1,  # 'Я'
-        3: 0,  # 'а'
-        21: 0,  # 'б'
-        10: 0,  # 'в'
-        19: 0,  # 'г'
-        13: 0,  # 'д'
-        2: 0,  # 'е'
-        24: 0,  # 'ж'
-        20: 0,  # 'з'
-        4: 0,  # 'и'
-        23: 0,  # 'й'
-        11: 0,  # 'к'
-        8: 0,  # 'л'
-        12: 0,  # 'м'
-        5: 0,  # 'н'
-        1: 0,  # 'о'
-        15: 0,  # 'п'
-        9: 0,  # 'Ñ€'
-        7: 0,  # 'Ñ'
-        6: 0,  # 'Ñ‚'
-        14: 0,  # 'у'
-        39: 0,  # 'Ñ„'
-        26: 0,  # 'Ñ…'
-        28: 0,  # 'ц'
-        22: 0,  # 'ч'
-        25: 0,  # 'ш'
-        29: 0,  # 'щ'
-        54: 0,  # 'ÑŠ'
-        18: 0,  # 'Ñ‹'
-        17: 0,  # 'ь'
-        30: 0,  # 'Ñ'
-        27: 0,  # 'ÑŽ'
-        16: 0,  # 'Ñ'
-    },
-    47: {  # 'Э'
-        37: 0,  # 'Ð'
-        44: 0,  # 'Б'
-        33: 1,  # 'Ð’'
-        46: 0,  # 'Г'
-        41: 1,  # 'Д'
-        48: 0,  # 'Е'
-        56: 0,  # 'Ж'
-        51: 0,  # 'З'
-        42: 0,  # 'И'
-        60: 1,  # 'Й'
-        36: 1,  # 'К'
-        49: 1,  # 'Л'
-        38: 1,  # 'М'
-        31: 1,  # 'Ð'
-        34: 0,  # 'О'
-        35: 1,  # 'П'
-        45: 1,  # 'Р'
-        32: 1,  # 'С'
-        40: 1,  # 'Т'
-        52: 0,  # 'У'
-        53: 0,  # 'Ф'
-        55: 0,  # 'Ð¥'
-        58: 0,  # 'Ц'
-        50: 0,  # 'Ч'
-        57: 0,  # 'Ш'
-        63: 0,  # 'Щ'
-        62: 0,  # 'Ы'
-        61: 0,  # 'Ь'
-        47: 0,  # 'Э'
-        59: 0,  # 'Ю'
-        43: 0,  # 'Я'
-        3: 1,  # 'а'
-        21: 1,  # 'б'
-        10: 2,  # 'в'
-        19: 1,  # 'г'
-        13: 2,  # 'д'
-        2: 0,  # 'е'
-        24: 1,  # 'ж'
-        20: 0,  # 'з'
-        4: 0,  # 'и'
-        23: 2,  # 'й'
-        11: 2,  # 'к'
-        8: 2,  # 'л'
-        12: 2,  # 'м'
-        5: 2,  # 'н'
-        1: 0,  # 'о'
-        15: 1,  # 'п'
-        9: 2,  # 'Ñ€'
-        7: 1,  # 'Ñ'
-        6: 3,  # 'Ñ‚'
-        14: 1,  # 'у'
-        39: 1,  # 'Ñ„'
-        26: 1,  # 'Ñ…'
-        28: 0,  # 'ц'
-        22: 0,  # 'ч'
-        25: 1,  # 'ш'
-        29: 0,  # 'щ'
-        54: 0,  # 'ÑŠ'
-        18: 0,  # 'Ñ‹'
-        17: 0,  # 'ь'
-        30: 0,  # 'Ñ'
-        27: 0,  # 'ÑŽ'
-        16: 0,  # 'Ñ'
-    },
-    59: {  # 'Ю'
-        37: 1,  # 'Ð'
-        44: 1,  # 'Б'
-        33: 0,  # 'Ð’'
-        46: 0,  # 'Г'
-        41: 1,  # 'Д'
-        48: 0,  # 'Е'
-        56: 0,  # 'Ж'
-        51: 0,  # 'З'
-        42: 0,  # 'И'
-        60: 0,  # 'Й'
-        36: 0,  # 'К'
-        49: 0,  # 'Л'
-        38: 0,  # 'М'
-        31: 1,  # 'Ð'
-        34: 0,  # 'О'
-        35: 0,  # 'П'
-        45: 1,  # 'Р'
-        32: 0,  # 'С'
-        40: 1,  # 'Т'
-        52: 0,  # 'У'
-        53: 0,  # 'Ф'
-        55: 0,  # 'Ð¥'
-        58: 0,  # 'Ц'
-        50: 1,  # 'Ч'
-        57: 0,  # 'Ш'
-        63: 1,  # 'Щ'
-        62: 0,  # 'Ы'
-        61: 0,  # 'Ь'
-        47: 0,  # 'Э'
-        59: 0,  # 'Ю'
-        43: 0,  # 'Я'
-        3: 0,  # 'а'
-        21: 1,  # 'б'
-        10: 0,  # 'в'
-        19: 1,  # 'г'
-        13: 1,  # 'д'
-        2: 0,  # 'е'
-        24: 1,  # 'ж'
-        20: 0,  # 'з'
-        4: 0,  # 'и'
-        23: 0,  # 'й'
-        11: 1,  # 'к'
-        8: 2,  # 'л'
-        12: 1,  # 'м'
-        5: 2,  # 'н'
-        1: 0,  # 'о'
-        15: 1,  # 'п'
-        9: 1,  # 'Ñ€'
-        7: 1,  # 'Ñ'
-        6: 0,  # 'Ñ‚'
-        14: 0,  # 'у'
-        39: 0,  # 'Ñ„'
-        26: 1,  # 'Ñ…'
-        28: 0,  # 'ц'
-        22: 0,  # 'ч'
-        25: 0,  # 'ш'
-        29: 0,  # 'щ'
-        54: 0,  # 'ÑŠ'
-        18: 0,  # 'Ñ‹'
-        17: 0,  # 'ь'
-        30: 0,  # 'Ñ'
-        27: 0,  # 'ÑŽ'
-        16: 0,  # 'Ñ'
-    },
-    43: {  # 'Я'
-        37: 0,  # 'Ð'
-        44: 0,  # 'Б'
-        33: 1,  # 'Ð’'
-        46: 1,  # 'Г'
-        41: 0,  # 'Д'
-        48: 1,  # 'Е'
-        56: 0,  # 'Ж'
-        51: 0,  # 'З'
-        42: 1,  # 'И'
-        60: 0,  # 'Й'
-        36: 1,  # 'К'
-        49: 0,  # 'Л'
-        38: 0,  # 'М'
-        31: 1,  # 'Ð'
-        34: 0,  # 'О'
-        35: 0,  # 'П'
-        45: 0,  # 'Р'
-        32: 1,  # 'С'
-        40: 1,  # 'Т'
-        52: 0,  # 'У'
-        53: 0,  # 'Ф'
-        55: 1,  # 'Ð¥'
-        58: 0,  # 'Ц'
-        50: 1,  # 'Ч'
-        57: 0,  # 'Ш'
-        63: 1,  # 'Щ'
-        62: 0,  # 'Ы'
-        61: 0,  # 'Ь'
-        47: 0,  # 'Э'
-        59: 1,  # 'Ю'
-        43: 1,  # 'Я'
-        3: 0,  # 'а'
-        21: 1,  # 'б'
-        10: 1,  # 'в'
-        19: 1,  # 'г'
-        13: 1,  # 'д'
-        2: 0,  # 'е'
-        24: 0,  # 'ж'
-        20: 1,  # 'з'
-        4: 0,  # 'и'
-        23: 1,  # 'й'
-        11: 1,  # 'к'
-        8: 1,  # 'л'
-        12: 1,  # 'м'
-        5: 2,  # 'н'
-        1: 0,  # 'о'
-        15: 1,  # 'п'
-        9: 1,  # 'Ñ€'
-        7: 1,  # 'Ñ'
-        6: 0,  # 'Ñ‚'
-        14: 0,  # 'у'
-        39: 0,  # 'Ñ„'
-        26: 1,  # 'Ñ…'
-        28: 0,  # 'ц'
-        22: 0,  # 'ч'
-        25: 1,  # 'ш'
-        29: 1,  # 'щ'
-        54: 0,  # 'ÑŠ'
-        18: 0,  # 'Ñ‹'
-        17: 0,  # 'ь'
-        30: 0,  # 'Ñ'
-        27: 0,  # 'ÑŽ'
-        16: 0,  # 'Ñ'
-    },
-    3: {  # 'а'
-        37: 0,  # 'Ð'
-        44: 0,  # 'Б'
-        33: 0,  # 'Ð’'
-        46: 0,  # 'Г'
-        41: 0,  # 'Д'
-        48: 0,  # 'Е'
-        56: 0,  # 'Ж'
-        51: 0,  # 'З'
-        42: 1,  # 'И'
-        60: 0,  # 'Й'
-        36: 0,  # 'К'
-        49: 0,  # 'Л'
-        38: 0,  # 'М'
-        31: 1,  # 'Ð'
-        34: 0,  # 'О'
-        35: 0,  # 'П'
-        45: 0,  # 'Р'
-        32: 0,  # 'С'
-        40: 0,  # 'Т'
-        52: 0,  # 'У'
-        53: 0,  # 'Ф'
-        55: 0,  # 'Ð¥'
-        58: 0,  # 'Ц'
-        50: 0,  # 'Ч'
-        57: 0,  # 'Ш'
-        63: 0,  # 'Щ'
-        62: 0,  # 'Ы'
-        61: 0,  # 'Ь'
-        47: 0,  # 'Э'
-        59: 0,  # 'Ю'
-        43: 0,  # 'Я'
-        3: 2,  # 'а'
-        21: 3,  # 'б'
-        10: 3,  # 'в'
-        19: 3,  # 'г'
-        13: 3,  # 'д'
-        2: 3,  # 'е'
-        24: 3,  # 'ж'
-        20: 3,  # 'з'
-        4: 3,  # 'и'
-        23: 3,  # 'й'
-        11: 3,  # 'к'
-        8: 3,  # 'л'
-        12: 3,  # 'м'
-        5: 3,  # 'н'
-        1: 2,  # 'о'
-        15: 3,  # 'п'
-        9: 3,  # 'Ñ€'
-        7: 3,  # 'Ñ'
-        6: 3,  # 'Ñ‚'
-        14: 3,  # 'у'
-        39: 2,  # 'Ñ„'
-        26: 3,  # 'Ñ…'
-        28: 3,  # 'ц'
-        22: 3,  # 'ч'
-        25: 3,  # 'ш'
-        29: 3,  # 'щ'
-        54: 0,  # 'ÑŠ'
-        18: 0,  # 'Ñ‹'
-        17: 0,  # 'ь'
-        30: 2,  # 'Ñ'
-        27: 3,  # 'ÑŽ'
-        16: 3,  # 'Ñ'
-    },
-    21: {  # 'б'
-        37: 0,  # 'Ð'
-        44: 0,  # 'Б'
-        33: 0,  # 'Ð’'
-        46: 0,  # 'Г'
-        41: 0,  # 'Д'
-        48: 0,  # 'Е'
-        56: 0,  # 'Ж'
-        51: 0,  # 'З'
-        42: 0,  # 'И'
-        60: 0,  # 'Й'
-        36: 1,  # 'К'
-        49: 0,  # 'Л'
-        38: 0,  # 'М'
-        31: 0,  # 'Ð'
-        34: 0,  # 'О'
-        35: 0,  # 'П'
-        45: 0,  # 'Р'
-        32: 0,  # 'С'
-        40: 0,  # 'Т'
-        52: 0,  # 'У'
-        53: 0,  # 'Ф'
-        55: 0,  # 'Ð¥'
-        58: 0,  # 'Ц'
-        50: 0,  # 'Ч'
-        57: 0,  # 'Ш'
-        63: 0,  # 'Щ'
-        62: 0,  # 'Ы'
-        61: 0,  # 'Ь'
-        47: 0,  # 'Э'
-        59: 0,  # 'Ю'
-        43: 0,  # 'Я'
-        3: 3,  # 'а'
-        21: 2,  # 'б'
-        10: 2,  # 'в'
-        19: 1,  # 'г'
-        13: 2,  # 'д'
-        2: 3,  # 'е'
-        24: 2,  # 'ж'
-        20: 1,  # 'з'
-        4: 3,  # 'и'
-        23: 0,  # 'й'
-        11: 2,  # 'к'
-        8: 3,  # 'л'
-        12: 2,  # 'м'
-        5: 3,  # 'н'
-        1: 3,  # 'о'
-        15: 1,  # 'п'
-        9: 3,  # 'Ñ€'
-        7: 3,  # 'Ñ'
-        6: 2,  # 'Ñ‚'
-        14: 3,  # 'у'
-        39: 0,  # 'Ñ„'
-        26: 2,  # 'Ñ…'
-        28: 1,  # 'ц'
-        22: 1,  # 'ч'
-        25: 2,  # 'ш'
-        29: 3,  # 'щ'
-        54: 2,  # 'ÑŠ'
-        18: 3,  # 'Ñ‹'
-        17: 2,  # 'ь'
-        30: 1,  # 'Ñ'
-        27: 2,  # 'ÑŽ'
-        16: 3,  # 'Ñ'
-    },
-    10: {  # 'в'
-        37: 0,  # 'Ð'
-        44: 0,  # 'Б'
-        33: 0,  # 'Ð’'
-        46: 0,  # 'Г'
-        41: 0,  # 'Д'
-        48: 0,  # 'Е'
-        56: 0,  # 'Ж'
-        51: 0,  # 'З'
-        42: 0,  # 'И'
-        60: 0,  # 'Й'
-        36: 0,  # 'К'
-        49: 0,  # 'Л'
-        38: 0,  # 'М'
-        31: 0,  # 'Ð'
-        34: 0,  # 'О'
-        35: 0,  # 'П'
-        45: 0,  # 'Р'
-        32: 0,  # 'С'
-        40: 0,  # 'Т'
-        52: 0,  # 'У'
-        53: 0,  # 'Ф'
-        55: 0,  # 'Ð¥'
-        58: 0,  # 'Ц'
-        50: 0,  # 'Ч'
-        57: 0,  # 'Ш'
-        63: 0,  # 'Щ'
-        62: 0,  # 'Ы'
-        61: 0,  # 'Ь'
-        47: 0,  # 'Э'
-        59: 0,  # 'Ю'
-        43: 0,  # 'Я'
-        3: 3,  # 'а'
-        21: 2,  # 'б'
-        10: 2,  # 'в'
-        19: 2,  # 'г'
-        13: 3,  # 'д'
-        2: 3,  # 'е'
-        24: 1,  # 'ж'
-        20: 3,  # 'з'
-        4: 3,  # 'и'
-        23: 0,  # 'й'
-        11: 3,  # 'к'
-        8: 3,  # 'л'
-        12: 2,  # 'м'
-        5: 3,  # 'н'
-        1: 3,  # 'о'
-        15: 3,  # 'п'
-        9: 3,  # 'Ñ€'
-        7: 3,  # 'Ñ'
-        6: 3,  # 'Ñ‚'
-        14: 3,  # 'у'
-        39: 1,  # 'Ñ„'
-        26: 2,  # 'Ñ…'
-        28: 2,  # 'ц'
-        22: 2,  # 'ч'
-        25: 3,  # 'ш'
-        29: 2,  # 'щ'
-        54: 2,  # 'ÑŠ'
-        18: 3,  # 'Ñ‹'
-        17: 3,  # 'ь'
-        30: 1,  # 'Ñ'
-        27: 1,  # 'ÑŽ'
-        16: 3,  # 'Ñ'
-    },
-    19: {  # 'г'
-        37: 0,  # 'Ð'
-        44: 0,  # 'Б'
-        33: 0,  # 'Ð’'
-        46: 0,  # 'Г'
-        41: 0,  # 'Д'
-        48: 0,  # 'Е'
-        56: 0,  # 'Ж'
-        51: 0,  # 'З'
-        42: 0,  # 'И'
-        60: 0,  # 'Й'
-        36: 0,  # 'К'
-        49: 0,  # 'Л'
-        38: 0,  # 'М'
-        31: 0,  # 'Ð'
-        34: 0,  # 'О'
-        35: 0,  # 'П'
-        45: 0,  # 'Р'
-        32: 0,  # 'С'
-        40: 0,  # 'Т'
-        52: 0,  # 'У'
-        53: 0,  # 'Ф'
-        55: 0,  # 'Ð¥'
-        58: 0,  # 'Ц'
-        50: 0,  # 'Ч'
-        57: 0,  # 'Ш'
-        63: 0,  # 'Щ'
-        62: 0,  # 'Ы'
-        61: 0,  # 'Ь'
-        47: 0,  # 'Э'
-        59: 0,  # 'Ю'
-        43: 0,  # 'Я'
-        3: 3,  # 'а'
-        21: 1,  # 'б'
-        10: 2,  # 'в'
-        19: 1,  # 'г'
-        13: 3,  # 'д'
-        2: 3,  # 'е'
-        24: 0,  # 'ж'
-        20: 1,  # 'з'
-        4: 3,  # 'и'
-        23: 0,  # 'й'
-        11: 2,  # 'к'
-        8: 3,  # 'л'
-        12: 2,  # 'м'
-        5: 3,  # 'н'
-        1: 3,  # 'о'
-        15: 0,  # 'п'
-        9: 3,  # 'Ñ€'
-        7: 2,  # 'Ñ'
-        6: 2,  # 'Ñ‚'
-        14: 3,  # 'у'
-        39: 1,  # 'Ñ„'
-        26: 1,  # 'Ñ…'
-        28: 1,  # 'ц'
-        22: 2,  # 'ч'
-        25: 1,  # 'ш'
-        29: 0,  # 'щ'
-        54: 0,  # 'ÑŠ'
-        18: 1,  # 'Ñ‹'
-        17: 1,  # 'ь'
-        30: 1,  # 'Ñ'
-        27: 1,  # 'ÑŽ'
-        16: 0,  # 'Ñ'
-    },
-    13: {  # 'д'
-        37: 0,  # 'Ð'
-        44: 0,  # 'Б'
-        33: 0,  # 'Ð’'
-        46: 0,  # 'Г'
-        41: 0,  # 'Д'
-        48: 0,  # 'Е'
-        56: 0,  # 'Ж'
-        51: 0,  # 'З'
-        42: 0,  # 'И'
-        60: 0,  # 'Й'
-        36: 0,  # 'К'
-        49: 0,  # 'Л'
-        38: 0,  # 'М'
-        31: 0,  # 'Ð'
-        34: 0,  # 'О'
-        35: 0,  # 'П'
-        45: 0,  # 'Р'
-        32: 0,  # 'С'
-        40: 0,  # 'Т'
-        52: 0,  # 'У'
-        53: 0,  # 'Ф'
-        55: 0,  # 'Ð¥'
-        58: 0,  # 'Ц'
-        50: 0,  # 'Ч'
-        57: 0,  # 'Ш'
-        63: 0,  # 'Щ'
-        62: 0,  # 'Ы'
-        61: 0,  # 'Ь'
-        47: 0,  # 'Э'
-        59: 0,  # 'Ю'
-        43: 0,  # 'Я'
-        3: 3,  # 'а'
-        21: 2,  # 'б'
-        10: 3,  # 'в'
-        19: 2,  # 'г'
-        13: 2,  # 'д'
-        2: 3,  # 'е'
-        24: 2,  # 'ж'
-        20: 2,  # 'з'
-        4: 3,  # 'и'
-        23: 0,  # 'й'
-        11: 3,  # 'к'
-        8: 3,  # 'л'
-        12: 2,  # 'м'
-        5: 3,  # 'н'
-        1: 3,  # 'о'
-        15: 2,  # 'п'
-        9: 3,  # 'Ñ€'
-        7: 3,  # 'Ñ'
-        6: 3,  # 'Ñ‚'
-        14: 3,  # 'у'
-        39: 1,  # 'Ñ„'
-        26: 2,  # 'Ñ…'
-        28: 3,  # 'ц'
-        22: 2,  # 'ч'
-        25: 2,  # 'ш'
-        29: 1,  # 'щ'
-        54: 2,  # 'ÑŠ'
-        18: 3,  # 'Ñ‹'
-        17: 3,  # 'ь'
-        30: 1,  # 'Ñ'
-        27: 2,  # 'ÑŽ'
-        16: 3,  # 'Ñ'
-    },
-    2: {  # 'е'
-        37: 0,  # 'Ð'
-        44: 0,  # 'Б'
-        33: 0,  # 'Ð’'
-        46: 0,  # 'Г'
-        41: 0,  # 'Д'
-        48: 0,  # 'Е'
-        56: 0,  # 'Ж'
-        51: 0,  # 'З'
-        42: 0,  # 'И'
-        60: 0,  # 'Й'
-        36: 0,  # 'К'
-        49: 0,  # 'Л'
-        38: 0,  # 'М'
-        31: 0,  # 'Ð'
-        34: 0,  # 'О'
-        35: 0,  # 'П'
-        45: 0,  # 'Р'
-        32: 0,  # 'С'
-        40: 0,  # 'Т'
-        52: 0,  # 'У'
-        53: 0,  # 'Ф'
-        55: 0,  # 'Ð¥'
-        58: 0,  # 'Ц'
-        50: 0,  # 'Ч'
-        57: 0,  # 'Ш'
-        63: 0,  # 'Щ'
-        62: 0,  # 'Ы'
-        61: 0,  # 'Ь'
-        47: 0,  # 'Э'
-        59: 0,  # 'Ю'
-        43: 0,  # 'Я'
-        3: 2,  # 'а'
-        21: 3,  # 'б'
-        10: 3,  # 'в'
-        19: 3,  # 'г'
-        13: 3,  # 'д'
-        2: 3,  # 'е'
-        24: 3,  # 'ж'
-        20: 3,  # 'з'
-        4: 2,  # 'и'
-        23: 3,  # 'й'
-        11: 3,  # 'к'
-        8: 3,  # 'л'
-        12: 3,  # 'м'
-        5: 3,  # 'н'
-        1: 3,  # 'о'
-        15: 3,  # 'п'
-        9: 3,  # 'Ñ€'
-        7: 3,  # 'Ñ'
-        6: 3,  # 'Ñ‚'
-        14: 2,  # 'у'
-        39: 2,  # 'Ñ„'
-        26: 3,  # 'Ñ…'
-        28: 3,  # 'ц'
-        22: 3,  # 'ч'
-        25: 3,  # 'ш'
-        29: 3,  # 'щ'
-        54: 0,  # 'ÑŠ'
-        18: 0,  # 'Ñ‹'
-        17: 0,  # 'ь'
-        30: 1,  # 'Ñ'
-        27: 2,  # 'ÑŽ'
-        16: 3,  # 'Ñ'
-    },
-    24: {  # 'ж'
-        37: 0,  # 'Ð'
-        44: 0,  # 'Б'
-        33: 0,  # 'Ð’'
-        46: 0,  # 'Г'
-        41: 0,  # 'Д'
-        48: 0,  # 'Е'
-        56: 0,  # 'Ж'
-        51: 0,  # 'З'
-        42: 0,  # 'И'
-        60: 0,  # 'Й'
-        36: 0,  # 'К'
-        49: 0,  # 'Л'
-        38: 0,  # 'М'
-        31: 0,  # 'Ð'
-        34: 0,  # 'О'
-        35: 0,  # 'П'
-        45: 0,  # 'Р'
-        32: 0,  # 'С'
-        40: 0,  # 'Т'
-        52: 0,  # 'У'
-        53: 0,  # 'Ф'
-        55: 0,  # 'Ð¥'
-        58: 0,  # 'Ц'
-        50: 0,  # 'Ч'
-        57: 0,  # 'Ш'
-        63: 0,  # 'Щ'
-        62: 0,  # 'Ы'
-        61: 0,  # 'Ь'
-        47: 0,  # 'Э'
-        59: 0,  # 'Ю'
-        43: 0,  # 'Я'
-        3: 3,  # 'а'
-        21: 2,  # 'б'
-        10: 1,  # 'в'
-        19: 2,  # 'г'
-        13: 3,  # 'д'
-        2: 3,  # 'е'
-        24: 2,  # 'ж'
-        20: 1,  # 'з'
-        4: 3,  # 'и'
-        23: 0,  # 'й'
-        11: 2,  # 'к'
-        8: 2,  # 'л'
-        12: 1,  # 'м'
-        5: 3,  # 'н'
-        1: 2,  # 'о'
-        15: 1,  # 'п'
-        9: 2,  # 'Ñ€'
-        7: 2,  # 'Ñ'
-        6: 1,  # 'Ñ‚'
-        14: 3,  # 'у'
-        39: 1,  # 'Ñ„'
-        26: 0,  # 'Ñ…'
-        28: 1,  # 'ц'
-        22: 2,  # 'ч'
-        25: 0,  # 'ш'
-        29: 0,  # 'щ'
-        54: 0,  # 'ÑŠ'
-        18: 1,  # 'Ñ‹'
-        17: 2,  # 'ь'
-        30: 1,  # 'Ñ'
-        27: 1,  # 'ÑŽ'
-        16: 1,  # 'Ñ'
-    },
-    20: {  # 'з'
-        37: 0,  # 'Ð'
-        44: 0,  # 'Б'
-        33: 0,  # 'Ð’'
-        46: 0,  # 'Г'
-        41: 0,  # 'Д'
-        48: 0,  # 'Е'
-        56: 0,  # 'Ж'
-        51: 0,  # 'З'
-        42: 0,  # 'И'
-        60: 0,  # 'Й'
-        36: 0,  # 'К'
-        49: 0,  # 'Л'
-        38: 0,  # 'М'
-        31: 0,  # 'Ð'
-        34: 0,  # 'О'
-        35: 0,  # 'П'
-        45: 0,  # 'Р'
-        32: 0,  # 'С'
-        40: 0,  # 'Т'
-        52: 0,  # 'У'
-        53: 0,  # 'Ф'
-        55: 0,  # 'Ð¥'
-        58: 0,  # 'Ц'
-        50: 0,  # 'Ч'
-        57: 0,  # 'Ш'
-        63: 0,  # 'Щ'
-        62: 0,  # 'Ы'
-        61: 0,  # 'Ь'
-        47: 0,  # 'Э'
-        59: 0,  # 'Ю'
-        43: 0,  # 'Я'
-        3: 3,  # 'а'
-        21: 3,  # 'б'
-        10: 3,  # 'в'
-        19: 3,  # 'г'
-        13: 3,  # 'д'
-        2: 3,  # 'е'
-        24: 2,  # 'ж'
-        20: 2,  # 'з'
-        4: 3,  # 'и'
-        23: 0,  # 'й'
-        11: 3,  # 'к'
-        8: 3,  # 'л'
-        12: 3,  # 'м'
-        5: 3,  # 'н'
-        1: 3,  # 'о'
-        15: 0,  # 'п'
-        9: 3,  # 'Ñ€'
-        7: 2,  # 'Ñ'
-        6: 2,  # 'Ñ‚'
-        14: 3,  # 'у'
-        39: 0,  # 'Ñ„'
-        26: 0,  # 'Ñ…'
-        28: 1,  # 'ц'
-        22: 2,  # 'ч'
-        25: 1,  # 'ш'
-        29: 0,  # 'щ'
-        54: 2,  # 'ÑŠ'
-        18: 3,  # 'Ñ‹'
-        17: 2,  # 'ь'
-        30: 1,  # 'Ñ'
-        27: 1,  # 'ÑŽ'
-        16: 3,  # 'Ñ'
-    },
-    4: {  # 'и'
-        37: 1,  # 'Ð'
-        44: 0,  # 'Б'
-        33: 0,  # 'Ð’'
-        46: 0,  # 'Г'
-        41: 0,  # 'Д'
-        48: 0,  # 'Е'
-        56: 0,  # 'Ж'
-        51: 0,  # 'З'
-        42: 0,  # 'И'
-        60: 0,  # 'Й'
-        36: 0,  # 'К'
-        49: 0,  # 'Л'
-        38: 0,  # 'М'
-        31: 1,  # 'Ð'
-        34: 0,  # 'О'
-        35: 0,  # 'П'
-        45: 0,  # 'Р'
-        32: 0,  # 'С'
-        40: 0,  # 'Т'
-        52: 0,  # 'У'
-        53: 0,  # 'Ф'
-        55: 0,  # 'Ð¥'
-        58: 0,  # 'Ц'
-        50: 0,  # 'Ч'
-        57: 0,  # 'Ш'
-        63: 0,  # 'Щ'
-        62: 0,  # 'Ы'
-        61: 0,  # 'Ь'
-        47: 0,  # 'Э'
-        59: 0,  # 'Ю'
-        43: 0,  # 'Я'
-        3: 3,  # 'а'
-        21: 3,  # 'б'
-        10: 3,  # 'в'
-        19: 3,  # 'г'
-        13: 3,  # 'д'
-        2: 3,  # 'е'
-        24: 3,  # 'ж'
-        20: 3,  # 'з'
-        4: 3,  # 'и'
-        23: 3,  # 'й'
-        11: 3,  # 'к'
-        8: 3,  # 'л'
-        12: 3,  # 'м'
-        5: 3,  # 'н'
-        1: 3,  # 'о'
-        15: 3,  # 'п'
-        9: 3,  # 'Ñ€'
-        7: 3,  # 'Ñ'
-        6: 3,  # 'Ñ‚'
-        14: 2,  # 'у'
-        39: 2,  # 'Ñ„'
-        26: 3,  # 'Ñ…'
-        28: 3,  # 'ц'
-        22: 3,  # 'ч'
-        25: 3,  # 'ш'
-        29: 3,  # 'щ'
-        54: 0,  # 'ÑŠ'
-        18: 0,  # 'Ñ‹'
-        17: 0,  # 'ь'
-        30: 2,  # 'Ñ'
-        27: 3,  # 'ÑŽ'
-        16: 3,  # 'Ñ'
-    },
-    23: {  # 'й'
-        37: 0,  # 'Ð'
-        44: 0,  # 'Б'
-        33: 0,  # 'Ð’'
-        46: 0,  # 'Г'
-        41: 0,  # 'Д'
-        48: 0,  # 'Е'
-        56: 0,  # 'Ж'
-        51: 0,  # 'З'
-        42: 0,  # 'И'
-        60: 0,  # 'Й'
-        36: 0,  # 'К'
-        49: 0,  # 'Л'
-        38: 0,  # 'М'
-        31: 0,  # 'Ð'
-        34: 0,  # 'О'
-        35: 0,  # 'П'
-        45: 0,  # 'Р'
-        32: 0,  # 'С'
-        40: 0,  # 'Т'
-        52: 0,  # 'У'
-        53: 0,  # 'Ф'
-        55: 0,  # 'Ð¥'
-        58: 0,  # 'Ц'
-        50: 0,  # 'Ч'
-        57: 0,  # 'Ш'
-        63: 0,  # 'Щ'
-        62: 0,  # 'Ы'
-        61: 0,  # 'Ь'
-        47: 0,  # 'Э'
-        59: 0,  # 'Ю'
-        43: 0,  # 'Я'
-        3: 1,  # 'а'
-        21: 1,  # 'б'
-        10: 1,  # 'в'
-        19: 2,  # 'г'
-        13: 3,  # 'д'
-        2: 2,  # 'е'
-        24: 0,  # 'ж'
-        20: 2,  # 'з'
-        4: 1,  # 'и'
-        23: 0,  # 'й'
-        11: 2,  # 'к'
-        8: 2,  # 'л'
-        12: 2,  # 'м'
-        5: 3,  # 'н'
-        1: 2,  # 'о'
-        15: 1,  # 'п'
-        9: 2,  # 'Ñ€'
-        7: 3,  # 'Ñ'
-        6: 3,  # 'Ñ‚'
-        14: 1,  # 'у'
-        39: 2,  # 'Ñ„'
-        26: 1,  # 'Ñ…'
-        28: 2,  # 'ц'
-        22: 3,  # 'ч'
-        25: 2,  # 'ш'
-        29: 1,  # 'щ'
-        54: 0,  # 'ÑŠ'
-        18: 0,  # 'Ñ‹'
-        17: 0,  # 'ь'
-        30: 1,  # 'Ñ'
-        27: 1,  # 'ÑŽ'
-        16: 2,  # 'Ñ'
-    },
-    11: {  # 'к'
-        37: 0,  # 'Ð'
-        44: 0,  # 'Б'
-        33: 0,  # 'Ð’'
-        46: 0,  # 'Г'
-        41: 0,  # 'Д'
-        48: 0,  # 'Е'
-        56: 0,  # 'Ж'
-        51: 0,  # 'З'
-        42: 0,  # 'И'
-        60: 0,  # 'Й'
-        36: 0,  # 'К'
-        49: 0,  # 'Л'
-        38: 0,  # 'М'
-        31: 0,  # 'Ð'
-        34: 0,  # 'О'
-        35: 0,  # 'П'
-        45: 0,  # 'Р'
-        32: 0,  # 'С'
-        40: 0,  # 'Т'
-        52: 0,  # 'У'
-        53: 0,  # 'Ф'
-        55: 0,  # 'Ð¥'
-        58: 0,  # 'Ц'
-        50: 0,  # 'Ч'
-        57: 0,  # 'Ш'
-        63: 0,  # 'Щ'
-        62: 0,  # 'Ы'
-        61: 0,  # 'Ь'
-        47: 0,  # 'Э'
-        59: 0,  # 'Ю'
-        43: 0,  # 'Я'
-        3: 3,  # 'а'
-        21: 1,  # 'б'
-        10: 3,  # 'в'
-        19: 1,  # 'г'
-        13: 1,  # 'д'
-        2: 3,  # 'е'
-        24: 2,  # 'ж'
-        20: 2,  # 'з'
-        4: 3,  # 'и'
-        23: 0,  # 'й'
-        11: 2,  # 'к'
-        8: 3,  # 'л'
-        12: 1,  # 'м'
-        5: 3,  # 'н'
-        1: 3,  # 'о'
-        15: 0,  # 'п'
-        9: 3,  # 'Ñ€'
-        7: 3,  # 'Ñ'
-        6: 3,  # 'Ñ‚'
-        14: 3,  # 'у'
-        39: 1,  # 'Ñ„'
-        26: 2,  # 'Ñ…'
-        28: 2,  # 'ц'
-        22: 1,  # 'ч'
-        25: 2,  # 'ш'
-        29: 0,  # 'щ'
-        54: 0,  # 'ÑŠ'
-        18: 1,  # 'Ñ‹'
-        17: 1,  # 'ь'
-        30: 1,  # 'Ñ'
-        27: 1,  # 'ÑŽ'
-        16: 1,  # 'Ñ'
-    },
-    8: {  # 'л'
-        37: 0,  # 'Ð'
-        44: 0,  # 'Б'
-        33: 0,  # 'Ð’'
-        46: 0,  # 'Г'
-        41: 0,  # 'Д'
-        48: 0,  # 'Е'
-        56: 0,  # 'Ж'
-        51: 0,  # 'З'
-        42: 0,  # 'И'
-        60: 0,  # 'Й'
-        36: 0,  # 'К'
-        49: 0,  # 'Л'
-        38: 0,  # 'М'
-        31: 0,  # 'Ð'
-        34: 0,  # 'О'
-        35: 0,  # 'П'
-        45: 0,  # 'Р'
-        32: 0,  # 'С'
-        40: 0,  # 'Т'
-        52: 0,  # 'У'
-        53: 0,  # 'Ф'
-        55: 0,  # 'Ð¥'
-        58: 0,  # 'Ц'
-        50: 0,  # 'Ч'
-        57: 0,  # 'Ш'
-        63: 0,  # 'Щ'
-        62: 0,  # 'Ы'
-        61: 0,  # 'Ь'
-        47: 0,  # 'Э'
-        59: 0,  # 'Ю'
-        43: 0,  # 'Я'
-        3: 3,  # 'а'
-        21: 2,  # 'б'
-        10: 2,  # 'в'
-        19: 3,  # 'г'
-        13: 2,  # 'д'
-        2: 3,  # 'е'
-        24: 3,  # 'ж'
-        20: 2,  # 'з'
-        4: 3,  # 'и'
-        23: 0,  # 'й'
-        11: 3,  # 'к'
-        8: 3,  # 'л'
-        12: 2,  # 'м'
-        5: 3,  # 'н'
-        1: 3,  # 'о'
-        15: 2,  # 'п'
-        9: 1,  # 'Ñ€'
-        7: 3,  # 'Ñ'
-        6: 2,  # 'Ñ‚'
-        14: 3,  # 'у'
-        39: 2,  # 'Ñ„'
-        26: 2,  # 'Ñ…'
-        28: 1,  # 'ц'
-        22: 3,  # 'ч'
-        25: 2,  # 'ш'
-        29: 1,  # 'щ'
-        54: 0,  # 'ÑŠ'
-        18: 3,  # 'Ñ‹'
-        17: 3,  # 'ь'
-        30: 1,  # 'Ñ'
-        27: 3,  # 'ÑŽ'
-        16: 3,  # 'Ñ'
-    },
-    12: {  # 'м'
-        37: 0,  # 'Ð'
-        44: 0,  # 'Б'
-        33: 0,  # 'Ð’'
-        46: 0,  # 'Г'
-        41: 0,  # 'Д'
-        48: 0,  # 'Е'
-        56: 0,  # 'Ж'
-        51: 0,  # 'З'
-        42: 0,  # 'И'
-        60: 0,  # 'Й'
-        36: 0,  # 'К'
-        49: 0,  # 'Л'
-        38: 0,  # 'М'
-        31: 0,  # 'Ð'
-        34: 0,  # 'О'
-        35: 0,  # 'П'
-        45: 0,  # 'Р'
-        32: 0,  # 'С'
-        40: 0,  # 'Т'
-        52: 0,  # 'У'
-        53: 0,  # 'Ф'
-        55: 0,  # 'Ð¥'
-        58: 0,  # 'Ц'
-        50: 0,  # 'Ч'
-        57: 0,  # 'Ш'
-        63: 0,  # 'Щ'
-        62: 0,  # 'Ы'
-        61: 0,  # 'Ь'
-        47: 0,  # 'Э'
-        59: 0,  # 'Ю'
-        43: 0,  # 'Я'
-        3: 3,  # 'а'
-        21: 2,  # 'б'
-        10: 2,  # 'в'
-        19: 2,  # 'г'
-        13: 1,  # 'д'
-        2: 3,  # 'е'
-        24: 1,  # 'ж'
-        20: 1,  # 'з'
-        4: 3,  # 'и'
-        23: 0,  # 'й'
-        11: 2,  # 'к'
-        8: 3,  # 'л'
-        12: 2,  # 'м'
-        5: 3,  # 'н'
-        1: 3,  # 'о'
-        15: 2,  # 'п'
-        9: 2,  # 'Ñ€'
-        7: 3,  # 'Ñ'
-        6: 2,  # 'Ñ‚'
-        14: 3,  # 'у'
-        39: 2,  # 'Ñ„'
-        26: 2,  # 'Ñ…'
-        28: 2,  # 'ц'
-        22: 2,  # 'ч'
-        25: 1,  # 'ш'
-        29: 1,  # 'щ'
-        54: 0,  # 'ÑŠ'
-        18: 3,  # 'Ñ‹'
-        17: 2,  # 'ь'
-        30: 2,  # 'Ñ'
-        27: 1,  # 'ÑŽ'
-        16: 3,  # 'Ñ'
-    },
-    5: {  # 'н'
-        37: 0,  # 'Ð'
-        44: 0,  # 'Б'
-        33: 0,  # 'Ð’'
-        46: 0,  # 'Г'
-        41: 0,  # 'Д'
-        48: 0,  # 'Е'
-        56: 0,  # 'Ж'
-        51: 0,  # 'З'
-        42: 0,  # 'И'
-        60: 0,  # 'Й'
-        36: 0,  # 'К'
-        49: 0,  # 'Л'
-        38: 0,  # 'М'
-        31: 0,  # 'Ð'
-        34: 0,  # 'О'
-        35: 0,  # 'П'
-        45: 0,  # 'Р'
-        32: 0,  # 'С'
-        40: 0,  # 'Т'
-        52: 0,  # 'У'
-        53: 0,  # 'Ф'
-        55: 0,  # 'Ð¥'
-        58: 0,  # 'Ц'
-        50: 0,  # 'Ч'
-        57: 0,  # 'Ш'
-        63: 0,  # 'Щ'
-        62: 0,  # 'Ы'
-        61: 0,  # 'Ь'
-        47: 0,  # 'Э'
-        59: 0,  # 'Ю'
-        43: 0,  # 'Я'
-        3: 3,  # 'а'
-        21: 2,  # 'б'
-        10: 2,  # 'в'
-        19: 3,  # 'г'
-        13: 3,  # 'д'
-        2: 3,  # 'е'
-        24: 2,  # 'ж'
-        20: 2,  # 'з'
-        4: 3,  # 'и'
-        23: 0,  # 'й'
-        11: 3,  # 'к'
-        8: 2,  # 'л'
-        12: 1,  # 'м'
-        5: 3,  # 'н'
-        1: 3,  # 'о'
-        15: 1,  # 'п'
-        9: 2,  # 'Ñ€'
-        7: 3,  # 'Ñ'
-        6: 3,  # 'Ñ‚'
-        14: 3,  # 'у'
-        39: 2,  # 'Ñ„'
-        26: 2,  # 'Ñ…'
-        28: 3,  # 'ц'
-        22: 3,  # 'ч'
-        25: 2,  # 'ш'
-        29: 2,  # 'щ'
-        54: 1,  # 'ÑŠ'
-        18: 3,  # 'Ñ‹'
-        17: 3,  # 'ь'
-        30: 1,  # 'Ñ'
-        27: 3,  # 'ÑŽ'
-        16: 3,  # 'Ñ'
-    },
-    1: {  # 'о'
-        37: 0,  # 'Ð'
-        44: 0,  # 'Б'
-        33: 0,  # 'Ð’'
-        46: 0,  # 'Г'
-        41: 0,  # 'Д'
-        48: 0,  # 'Е'
-        56: 0,  # 'Ж'
-        51: 0,  # 'З'
-        42: 0,  # 'И'
-        60: 0,  # 'Й'
-        36: 0,  # 'К'
-        49: 0,  # 'Л'
-        38: 0,  # 'М'
-        31: 0,  # 'Ð'
-        34: 0,  # 'О'
-        35: 0,  # 'П'
-        45: 0,  # 'Р'
-        32: 0,  # 'С'
-        40: 0,  # 'Т'
-        52: 0,  # 'У'
-        53: 0,  # 'Ф'
-        55: 0,  # 'Ð¥'
-        58: 0,  # 'Ц'
-        50: 0,  # 'Ч'
-        57: 0,  # 'Ш'
-        63: 0,  # 'Щ'
-        62: 0,  # 'Ы'
-        61: 0,  # 'Ь'
-        47: 0,  # 'Э'
-        59: 0,  # 'Ю'
-        43: 0,  # 'Я'
-        3: 2,  # 'а'
-        21: 3,  # 'б'
-        10: 3,  # 'в'
-        19: 3,  # 'г'
-        13: 3,  # 'д'
-        2: 3,  # 'е'
-        24: 3,  # 'ж'
-        20: 3,  # 'з'
-        4: 3,  # 'и'
-        23: 3,  # 'й'
-        11: 3,  # 'к'
-        8: 3,  # 'л'
-        12: 3,  # 'м'
-        5: 3,  # 'н'
-        1: 3,  # 'о'
-        15: 3,  # 'п'
-        9: 3,  # 'Ñ€'
-        7: 3,  # 'Ñ'
-        6: 3,  # 'Ñ‚'
-        14: 2,  # 'у'
-        39: 2,  # 'Ñ„'
-        26: 3,  # 'Ñ…'
-        28: 2,  # 'ц'
-        22: 3,  # 'ч'
-        25: 3,  # 'ш'
-        29: 3,  # 'щ'
-        54: 0,  # 'ÑŠ'
-        18: 0,  # 'Ñ‹'
-        17: 0,  # 'ь'
-        30: 2,  # 'Ñ'
-        27: 3,  # 'ÑŽ'
-        16: 3,  # 'Ñ'
-    },
-    15: {  # 'п'
-        37: 0,  # 'Ð'
-        44: 0,  # 'Б'
-        33: 0,  # 'Ð’'
-        46: 0,  # 'Г'
-        41: 0,  # 'Д'
-        48: 0,  # 'Е'
-        56: 0,  # 'Ж'
-        51: 0,  # 'З'
-        42: 0,  # 'И'
-        60: 0,  # 'Й'
-        36: 0,  # 'К'
-        49: 0,  # 'Л'
-        38: 0,  # 'М'
-        31: 0,  # 'Ð'
-        34: 0,  # 'О'
-        35: 0,  # 'П'
-        45: 0,  # 'Р'
-        32: 0,  # 'С'
-        40: 0,  # 'Т'
-        52: 0,  # 'У'
-        53: 0,  # 'Ф'
-        55: 0,  # 'Ð¥'
-        58: 0,  # 'Ц'
-        50: 0,  # 'Ч'
-        57: 0,  # 'Ш'
-        63: 0,  # 'Щ'
-        62: 0,  # 'Ы'
-        61: 0,  # 'Ь'
-        47: 0,  # 'Э'
-        59: 0,  # 'Ю'
-        43: 0,  # 'Я'
-        3: 3,  # 'а'
-        21: 1,  # 'б'
-        10: 0,  # 'в'
-        19: 0,  # 'г'
-        13: 0,  # 'д'
-        2: 3,  # 'е'
-        24: 0,  # 'ж'
-        20: 0,  # 'з'
-        4: 3,  # 'и'
-        23: 0,  # 'й'
-        11: 2,  # 'к'
-        8: 3,  # 'л'
-        12: 1,  # 'м'
-        5: 3,  # 'н'
-        1: 3,  # 'о'
-        15: 2,  # 'п'
-        9: 3,  # 'Ñ€'
-        7: 2,  # 'Ñ'
-        6: 2,  # 'Ñ‚'
-        14: 3,  # 'у'
-        39: 1,  # 'Ñ„'
-        26: 0,  # 'Ñ…'
-        28: 2,  # 'ц'
-        22: 2,  # 'ч'
-        25: 1,  # 'ш'
-        29: 1,  # 'щ'
-        54: 0,  # 'ÑŠ'
-        18: 3,  # 'Ñ‹'
-        17: 2,  # 'ь'
-        30: 1,  # 'Ñ'
-        27: 1,  # 'ÑŽ'
-        16: 3,  # 'Ñ'
-    },
-    9: {  # 'Ñ€'
-        37: 0,  # 'Ð'
-        44: 0,  # 'Б'
-        33: 0,  # 'Ð’'
-        46: 0,  # 'Г'
-        41: 0,  # 'Д'
-        48: 0,  # 'Е'
-        56: 0,  # 'Ж'
-        51: 0,  # 'З'
-        42: 0,  # 'И'
-        60: 0,  # 'Й'
-        36: 0,  # 'К'
-        49: 0,  # 'Л'
-        38: 0,  # 'М'
-        31: 0,  # 'Ð'
-        34: 0,  # 'О'
-        35: 0,  # 'П'
-        45: 0,  # 'Р'
-        32: 0,  # 'С'
-        40: 0,  # 'Т'
-        52: 0,  # 'У'
-        53: 0,  # 'Ф'
-        55: 0,  # 'Ð¥'
-        58: 0,  # 'Ц'
-        50: 0,  # 'Ч'
-        57: 0,  # 'Ш'
-        63: 0,  # 'Щ'
-        62: 0,  # 'Ы'
-        61: 0,  # 'Ь'
-        47: 0,  # 'Э'
-        59: 0,  # 'Ю'
-        43: 0,  # 'Я'
-        3: 3,  # 'а'
-        21: 2,  # 'б'
-        10: 3,  # 'в'
-        19: 3,  # 'г'
-        13: 3,  # 'д'
-        2: 3,  # 'е'
-        24: 3,  # 'ж'
-        20: 2,  # 'з'
-        4: 3,  # 'и'
-        23: 0,  # 'й'
-        11: 3,  # 'к'
-        8: 2,  # 'л'
-        12: 3,  # 'м'
-        5: 3,  # 'н'
-        1: 3,  # 'о'
-        15: 2,  # 'п'
-        9: 2,  # 'Ñ€'
-        7: 3,  # 'Ñ'
-        6: 3,  # 'Ñ‚'
-        14: 3,  # 'у'
-        39: 2,  # 'Ñ„'
-        26: 3,  # 'Ñ…'
-        28: 2,  # 'ц'
-        22: 2,  # 'ч'
-        25: 3,  # 'ш'
-        29: 2,  # 'щ'
-        54: 0,  # 'ÑŠ'
-        18: 3,  # 'Ñ‹'
-        17: 3,  # 'ь'
-        30: 2,  # 'Ñ'
-        27: 2,  # 'ÑŽ'
-        16: 3,  # 'Ñ'
-    },
-    7: {  # 'Ñ'
-        37: 0,  # 'Ð'
-        44: 0,  # 'Б'
-        33: 0,  # 'Ð’'
-        46: 0,  # 'Г'
-        41: 0,  # 'Д'
-        48: 0,  # 'Е'
-        56: 0,  # 'Ж'
-        51: 1,  # 'З'
-        42: 0,  # 'И'
-        60: 0,  # 'Й'
-        36: 0,  # 'К'
-        49: 0,  # 'Л'
-        38: 0,  # 'М'
-        31: 0,  # 'Ð'
-        34: 0,  # 'О'
-        35: 0,  # 'П'
-        45: 0,  # 'Р'
-        32: 0,  # 'С'
-        40: 0,  # 'Т'
-        52: 0,  # 'У'
-        53: 0,  # 'Ф'
-        55: 0,  # 'Ð¥'
-        58: 0,  # 'Ц'
-        50: 0,  # 'Ч'
-        57: 0,  # 'Ш'
-        63: 0,  # 'Щ'
-        62: 0,  # 'Ы'
-        61: 0,  # 'Ь'
-        47: 0,  # 'Э'
-        59: 0,  # 'Ю'
-        43: 0,  # 'Я'
-        3: 3,  # 'а'
-        21: 2,  # 'б'
-        10: 3,  # 'в'
-        19: 2,  # 'г'
-        13: 3,  # 'д'
-        2: 3,  # 'е'
-        24: 2,  # 'ж'
-        20: 2,  # 'з'
-        4: 3,  # 'и'
-        23: 0,  # 'й'
-        11: 3,  # 'к'
-        8: 3,  # 'л'
-        12: 3,  # 'м'
-        5: 3,  # 'н'
-        1: 3,  # 'о'
-        15: 3,  # 'п'
-        9: 3,  # 'Ñ€'
-        7: 3,  # 'Ñ'
-        6: 3,  # 'Ñ‚'
-        14: 3,  # 'у'
-        39: 2,  # 'Ñ„'
-        26: 3,  # 'Ñ…'
-        28: 2,  # 'ц'
-        22: 3,  # 'ч'
-        25: 2,  # 'ш'
-        29: 1,  # 'щ'
-        54: 2,  # 'ÑŠ'
-        18: 3,  # 'Ñ‹'
-        17: 3,  # 'ь'
-        30: 2,  # 'Ñ'
-        27: 3,  # 'ÑŽ'
-        16: 3,  # 'Ñ'
-    },
-    6: {  # 'Ñ‚'
-        37: 0,  # 'Ð'
-        44: 0,  # 'Б'
-        33: 0,  # 'Ð’'
-        46: 0,  # 'Г'
-        41: 0,  # 'Д'
-        48: 0,  # 'Е'
-        56: 0,  # 'Ж'
-        51: 0,  # 'З'
-        42: 0,  # 'И'
-        60: 0,  # 'Й'
-        36: 0,  # 'К'
-        49: 0,  # 'Л'
-        38: 0,  # 'М'
-        31: 0,  # 'Ð'
-        34: 0,  # 'О'
-        35: 0,  # 'П'
-        45: 0,  # 'Р'
-        32: 0,  # 'С'
-        40: 0,  # 'Т'
-        52: 0,  # 'У'
-        53: 0,  # 'Ф'
-        55: 0,  # 'Ð¥'
-        58: 0,  # 'Ц'
-        50: 0,  # 'Ч'
-        57: 0,  # 'Ш'
-        63: 0,  # 'Щ'
-        62: 0,  # 'Ы'
-        61: 0,  # 'Ь'
-        47: 0,  # 'Э'
-        59: 0,  # 'Ю'
-        43: 0,  # 'Я'
-        3: 3,  # 'а'
-        21: 2,  # 'б'
-        10: 3,  # 'в'
-        19: 2,  # 'г'
-        13: 2,  # 'д'
-        2: 3,  # 'е'
-        24: 1,  # 'ж'
-        20: 1,  # 'з'
-        4: 3,  # 'и'
-        23: 0,  # 'й'
-        11: 3,  # 'к'
-        8: 3,  # 'л'
-        12: 2,  # 'м'
-        5: 3,  # 'н'
-        1: 3,  # 'о'
-        15: 2,  # 'п'
-        9: 3,  # 'Ñ€'
-        7: 3,  # 'Ñ'
-        6: 2,  # 'Ñ‚'
-        14: 3,  # 'у'
-        39: 2,  # 'Ñ„'
-        26: 2,  # 'Ñ…'
-        28: 2,  # 'ц'
-        22: 2,  # 'ч'
-        25: 2,  # 'ш'
-        29: 2,  # 'щ'
-        54: 2,  # 'ÑŠ'
-        18: 3,  # 'Ñ‹'
-        17: 3,  # 'ь'
-        30: 2,  # 'Ñ'
-        27: 2,  # 'ÑŽ'
-        16: 3,  # 'Ñ'
-    },
-    14: {  # 'у'
-        37: 0,  # 'Ð'
-        44: 0,  # 'Б'
-        33: 0,  # 'Ð’'
-        46: 0,  # 'Г'
-        41: 0,  # 'Д'
-        48: 0,  # 'Е'
-        56: 0,  # 'Ж'
-        51: 0,  # 'З'
-        42: 0,  # 'И'
-        60: 0,  # 'Й'
-        36: 0,  # 'К'
-        49: 0,  # 'Л'
-        38: 0,  # 'М'
-        31: 0,  # 'Ð'
-        34: 0,  # 'О'
-        35: 0,  # 'П'
-        45: 0,  # 'Р'
-        32: 0,  # 'С'
-        40: 0,  # 'Т'
-        52: 0,  # 'У'
-        53: 0,  # 'Ф'
-        55: 0,  # 'Ð¥'
-        58: 0,  # 'Ц'
-        50: 0,  # 'Ч'
-        57: 0,  # 'Ш'
-        63: 0,  # 'Щ'
-        62: 0,  # 'Ы'
-        61: 0,  # 'Ь'
-        47: 0,  # 'Э'
-        59: 0,  # 'Ю'
-        43: 0,  # 'Я'
-        3: 2,  # 'а'
-        21: 3,  # 'б'
-        10: 3,  # 'в'
-        19: 3,  # 'г'
-        13: 3,  # 'д'
-        2: 3,  # 'е'
-        24: 3,  # 'ж'
-        20: 3,  # 'з'
-        4: 2,  # 'и'
-        23: 2,  # 'й'
-        11: 3,  # 'к'
-        8: 3,  # 'л'
-        12: 3,  # 'м'
-        5: 3,  # 'н'
-        1: 2,  # 'о'
-        15: 3,  # 'п'
-        9: 3,  # 'Ñ€'
-        7: 3,  # 'Ñ'
-        6: 3,  # 'Ñ‚'
-        14: 1,  # 'у'
-        39: 2,  # 'Ñ„'
-        26: 3,  # 'Ñ…'
-        28: 2,  # 'ц'
-        22: 3,  # 'ч'
-        25: 3,  # 'ш'
-        29: 3,  # 'щ'
-        54: 0,  # 'ÑŠ'
-        18: 0,  # 'Ñ‹'
-        17: 0,  # 'ь'
-        30: 2,  # 'Ñ'
-        27: 3,  # 'ÑŽ'
-        16: 2,  # 'Ñ'
-    },
-    39: {  # 'Ñ„'
-        37: 0,  # 'Ð'
-        44: 0,  # 'Б'
-        33: 0,  # 'Ð’'
-        46: 0,  # 'Г'
-        41: 0,  # 'Д'
-        48: 0,  # 'Е'
-        56: 0,  # 'Ж'
-        51: 0,  # 'З'
-        42: 0,  # 'И'
-        60: 0,  # 'Й'
-        36: 0,  # 'К'
-        49: 0,  # 'Л'
-        38: 0,  # 'М'
-        31: 0,  # 'Ð'
-        34: 0,  # 'О'
-        35: 0,  # 'П'
-        45: 0,  # 'Р'
-        32: 0,  # 'С'
-        40: 0,  # 'Т'
-        52: 0,  # 'У'
-        53: 0,  # 'Ф'
-        55: 0,  # 'Ð¥'
-        58: 0,  # 'Ц'
-        50: 0,  # 'Ч'
-        57: 0,  # 'Ш'
-        63: 0,  # 'Щ'
-        62: 0,  # 'Ы'
-        61: 0,  # 'Ь'
-        47: 0,  # 'Э'
-        59: 0,  # 'Ю'
-        43: 0,  # 'Я'
-        3: 3,  # 'а'
-        21: 1,  # 'б'
-        10: 0,  # 'в'
-        19: 1,  # 'г'
-        13: 0,  # 'д'
-        2: 3,  # 'е'
-        24: 0,  # 'ж'
-        20: 0,  # 'з'
-        4: 3,  # 'и'
-        23: 0,  # 'й'
-        11: 1,  # 'к'
-        8: 2,  # 'л'
-        12: 1,  # 'м'
-        5: 1,  # 'н'
-        1: 3,  # 'о'
-        15: 1,  # 'п'
-        9: 2,  # 'Ñ€'
-        7: 2,  # 'Ñ'
-        6: 2,  # 'Ñ‚'
-        14: 2,  # 'у'
-        39: 2,  # 'Ñ„'
-        26: 0,  # 'Ñ…'
-        28: 0,  # 'ц'
-        22: 1,  # 'ч'
-        25: 1,  # 'ш'
-        29: 0,  # 'щ'
-        54: 0,  # 'ÑŠ'
-        18: 2,  # 'Ñ‹'
-        17: 1,  # 'ь'
-        30: 2,  # 'Ñ'
-        27: 1,  # 'ÑŽ'
-        16: 1,  # 'Ñ'
-    },
-    26: {  # 'Ñ…'
-        37: 0,  # 'Ð'
-        44: 0,  # 'Б'
-        33: 0,  # 'Ð’'
-        46: 0,  # 'Г'
-        41: 0,  # 'Д'
-        48: 0,  # 'Е'
-        56: 0,  # 'Ж'
-        51: 0,  # 'З'
-        42: 0,  # 'И'
-        60: 0,  # 'Й'
-        36: 0,  # 'К'
-        49: 0,  # 'Л'
-        38: 0,  # 'М'
-        31: 0,  # 'Ð'
-        34: 0,  # 'О'
-        35: 0,  # 'П'
-        45: 0,  # 'Р'
-        32: 0,  # 'С'
-        40: 0,  # 'Т'
-        52: 0,  # 'У'
-        53: 0,  # 'Ф'
-        55: 0,  # 'Ð¥'
-        58: 0,  # 'Ц'
-        50: 0,  # 'Ч'
-        57: 0,  # 'Ш'
-        63: 0,  # 'Щ'
-        62: 0,  # 'Ы'
-        61: 0,  # 'Ь'
-        47: 0,  # 'Э'
-        59: 0,  # 'Ю'
-        43: 0,  # 'Я'
-        3: 3,  # 'а'
-        21: 0,  # 'б'
-        10: 3,  # 'в'
-        19: 1,  # 'г'
-        13: 1,  # 'д'
-        2: 2,  # 'е'
-        24: 0,  # 'ж'
-        20: 1,  # 'з'
-        4: 3,  # 'и'
-        23: 0,  # 'й'
-        11: 1,  # 'к'
-        8: 2,  # 'л'
-        12: 2,  # 'м'
-        5: 3,  # 'н'
-        1: 3,  # 'о'
-        15: 1,  # 'п'
-        9: 3,  # 'Ñ€'
-        7: 2,  # 'Ñ'
-        6: 2,  # 'Ñ‚'
-        14: 2,  # 'у'
-        39: 1,  # 'Ñ„'
-        26: 1,  # 'Ñ…'
-        28: 1,  # 'ц'
-        22: 1,  # 'ч'
-        25: 2,  # 'ш'
-        29: 0,  # 'щ'
-        54: 1,  # 'ÑŠ'
-        18: 0,  # 'Ñ‹'
-        17: 1,  # 'ь'
-        30: 1,  # 'Ñ'
-        27: 1,  # 'ÑŽ'
-        16: 0,  # 'Ñ'
-    },
-    28: {  # 'ц'
-        37: 0,  # 'Ð'
-        44: 0,  # 'Б'
-        33: 0,  # 'Ð’'
-        46: 0,  # 'Г'
-        41: 0,  # 'Д'
-        48: 0,  # 'Е'
-        56: 0,  # 'Ж'
-        51: 0,  # 'З'
-        42: 0,  # 'И'
-        60: 0,  # 'Й'
-        36: 0,  # 'К'
-        49: 0,  # 'Л'
-        38: 0,  # 'М'
-        31: 0,  # 'Ð'
-        34: 0,  # 'О'
-        35: 0,  # 'П'
-        45: 0,  # 'Р'
-        32: 0,  # 'С'
-        40: 0,  # 'Т'
-        52: 0,  # 'У'
-        53: 0,  # 'Ф'
-        55: 0,  # 'Ð¥'
-        58: 0,  # 'Ц'
-        50: 0,  # 'Ч'
-        57: 0,  # 'Ш'
-        63: 0,  # 'Щ'
-        62: 0,  # 'Ы'
-        61: 0,  # 'Ь'
-        47: 0,  # 'Э'
-        59: 0,  # 'Ю'
-        43: 0,  # 'Я'
-        3: 3,  # 'а'
-        21: 1,  # 'б'
-        10: 2,  # 'в'
-        19: 1,  # 'г'
-        13: 1,  # 'д'
-        2: 3,  # 'е'
-        24: 0,  # 'ж'
-        20: 1,  # 'з'
-        4: 3,  # 'и'
-        23: 0,  # 'й'
-        11: 2,  # 'к'
-        8: 1,  # 'л'
-        12: 1,  # 'м'
-        5: 1,  # 'н'
-        1: 3,  # 'о'
-        15: 0,  # 'п'
-        9: 1,  # 'Ñ€'
-        7: 0,  # 'Ñ'
-        6: 1,  # 'Ñ‚'
-        14: 3,  # 'у'
-        39: 0,  # 'Ñ„'
-        26: 0,  # 'Ñ…'
-        28: 1,  # 'ц'
-        22: 0,  # 'ч'
-        25: 1,  # 'ш'
-        29: 0,  # 'щ'
-        54: 0,  # 'ÑŠ'
-        18: 3,  # 'Ñ‹'
-        17: 1,  # 'ь'
-        30: 0,  # 'Ñ'
-        27: 1,  # 'ÑŽ'
-        16: 0,  # 'Ñ'
-    },
-    22: {  # 'ч'
-        37: 0,  # 'Ð'
-        44: 0,  # 'Б'
-        33: 0,  # 'Ð’'
-        46: 0,  # 'Г'
-        41: 0,  # 'Д'
-        48: 0,  # 'Е'
-        56: 0,  # 'Ж'
-        51: 0,  # 'З'
-        42: 0,  # 'И'
-        60: 0,  # 'Й'
-        36: 0,  # 'К'
-        49: 0,  # 'Л'
-        38: 0,  # 'М'
-        31: 0,  # 'Ð'
-        34: 0,  # 'О'
-        35: 0,  # 'П'
-        45: 0,  # 'Р'
-        32: 0,  # 'С'
-        40: 0,  # 'Т'
-        52: 0,  # 'У'
-        53: 0,  # 'Ф'
-        55: 0,  # 'Ð¥'
-        58: 0,  # 'Ц'
-        50: 0,  # 'Ч'
-        57: 0,  # 'Ш'
-        63: 0,  # 'Щ'
-        62: 0,  # 'Ы'
-        61: 0,  # 'Ь'
-        47: 0,  # 'Э'
-        59: 0,  # 'Ю'
-        43: 0,  # 'Я'
-        3: 3,  # 'а'
-        21: 1,  # 'б'
-        10: 1,  # 'в'
-        19: 0,  # 'г'
-        13: 0,  # 'д'
-        2: 3,  # 'е'
-        24: 1,  # 'ж'
-        20: 0,  # 'з'
-        4: 3,  # 'и'
-        23: 0,  # 'й'
-        11: 3,  # 'к'
-        8: 2,  # 'л'
-        12: 1,  # 'м'
-        5: 3,  # 'н'
-        1: 2,  # 'о'
-        15: 0,  # 'п'
-        9: 2,  # 'Ñ€'
-        7: 1,  # 'Ñ'
-        6: 3,  # 'Ñ‚'
-        14: 3,  # 'у'
-        39: 1,  # 'Ñ„'
-        26: 1,  # 'Ñ…'
-        28: 0,  # 'ц'
-        22: 1,  # 'ч'
-        25: 2,  # 'ш'
-        29: 0,  # 'щ'
-        54: 0,  # 'ÑŠ'
-        18: 0,  # 'Ñ‹'
-        17: 3,  # 'ь'
-        30: 0,  # 'Ñ'
-        27: 0,  # 'ÑŽ'
-        16: 0,  # 'Ñ'
-    },
-    25: {  # 'ш'
-        37: 0,  # 'Ð'
-        44: 0,  # 'Б'
-        33: 0,  # 'Ð’'
-        46: 0,  # 'Г'
-        41: 0,  # 'Д'
-        48: 0,  # 'Е'
-        56: 0,  # 'Ж'
-        51: 0,  # 'З'
-        42: 0,  # 'И'
-        60: 0,  # 'Й'
-        36: 0,  # 'К'
-        49: 0,  # 'Л'
-        38: 0,  # 'М'
-        31: 0,  # 'Ð'
-        34: 0,  # 'О'
-        35: 0,  # 'П'
-        45: 0,  # 'Р'
-        32: 0,  # 'С'
-        40: 0,  # 'Т'
-        52: 0,  # 'У'
-        53: 0,  # 'Ф'
-        55: 0,  # 'Ð¥'
-        58: 0,  # 'Ц'
-        50: 0,  # 'Ч'
-        57: 0,  # 'Ш'
-        63: 0,  # 'Щ'
-        62: 0,  # 'Ы'
-        61: 0,  # 'Ь'
-        47: 0,  # 'Э'
-        59: 0,  # 'Ю'
-        43: 0,  # 'Я'
-        3: 3,  # 'а'
-        21: 1,  # 'б'
-        10: 2,  # 'в'
-        19: 1,  # 'г'
-        13: 0,  # 'д'
-        2: 3,  # 'е'
-        24: 0,  # 'ж'
-        20: 0,  # 'з'
-        4: 3,  # 'и'
-        23: 0,  # 'й'
-        11: 3,  # 'к'
-        8: 3,  # 'л'
-        12: 2,  # 'м'
-        5: 3,  # 'н'
-        1: 3,  # 'о'
-        15: 2,  # 'п'
-        9: 2,  # 'Ñ€'
-        7: 1,  # 'Ñ'
-        6: 2,  # 'Ñ‚'
-        14: 3,  # 'у'
-        39: 2,  # 'Ñ„'
-        26: 1,  # 'Ñ…'
-        28: 1,  # 'ц'
-        22: 1,  # 'ч'
-        25: 1,  # 'ш'
-        29: 0,  # 'щ'
-        54: 0,  # 'ÑŠ'
-        18: 0,  # 'Ñ‹'
-        17: 3,  # 'ь'
-        30: 1,  # 'Ñ'
-        27: 1,  # 'ÑŽ'
-        16: 0,  # 'Ñ'
-    },
-    29: {  # 'щ'
-        37: 0,  # 'Ð'
-        44: 0,  # 'Б'
-        33: 0,  # 'Ð’'
-        46: 0,  # 'Г'
-        41: 0,  # 'Д'
-        48: 0,  # 'Е'
-        56: 0,  # 'Ж'
-        51: 0,  # 'З'
-        42: 0,  # 'И'
-        60: 0,  # 'Й'
-        36: 0,  # 'К'
-        49: 0,  # 'Л'
-        38: 0,  # 'М'
-        31: 0,  # 'Ð'
-        34: 0,  # 'О'
-        35: 0,  # 'П'
-        45: 0,  # 'Р'
-        32: 0,  # 'С'
-        40: 0,  # 'Т'
-        52: 0,  # 'У'
-        53: 0,  # 'Ф'
-        55: 0,  # 'Ð¥'
-        58: 0,  # 'Ц'
-        50: 0,  # 'Ч'
-        57: 0,  # 'Ш'
-        63: 0,  # 'Щ'
-        62: 0,  # 'Ы'
-        61: 0,  # 'Ь'
-        47: 0,  # 'Э'
-        59: 0,  # 'Ю'
-        43: 0,  # 'Я'
-        3: 3,  # 'а'
-        21: 0,  # 'б'
-        10: 1,  # 'в'
-        19: 0,  # 'г'
-        13: 0,  # 'д'
-        2: 3,  # 'е'
-        24: 0,  # 'ж'
-        20: 0,  # 'з'
-        4: 3,  # 'и'
-        23: 0,  # 'й'
-        11: 0,  # 'к'
-        8: 0,  # 'л'
-        12: 1,  # 'м'
-        5: 2,  # 'н'
-        1: 1,  # 'о'
-        15: 0,  # 'п'
-        9: 2,  # 'Ñ€'
-        7: 0,  # 'Ñ'
-        6: 0,  # 'Ñ‚'
-        14: 2,  # 'у'
-        39: 0,  # 'Ñ„'
-        26: 0,  # 'Ñ…'
-        28: 0,  # 'ц'
-        22: 0,  # 'ч'
-        25: 0,  # 'ш'
-        29: 0,  # 'щ'
-        54: 0,  # 'ÑŠ'
-        18: 0,  # 'Ñ‹'
-        17: 2,  # 'ь'
-        30: 0,  # 'Ñ'
-        27: 0,  # 'ÑŽ'
-        16: 0,  # 'Ñ'
-    },
-    54: {  # 'ÑŠ'
-        37: 0,  # 'Ð'
-        44: 0,  # 'Б'
-        33: 0,  # 'Ð’'
-        46: 0,  # 'Г'
-        41: 0,  # 'Д'
-        48: 0,  # 'Е'
-        56: 0,  # 'Ж'
-        51: 0,  # 'З'
-        42: 0,  # 'И'
-        60: 0,  # 'Й'
-        36: 0,  # 'К'
-        49: 0,  # 'Л'
-        38: 0,  # 'М'
-        31: 0,  # 'Ð'
-        34: 0,  # 'О'
-        35: 0,  # 'П'
-        45: 0,  # 'Р'
-        32: 0,  # 'С'
-        40: 0,  # 'Т'
-        52: 0,  # 'У'
-        53: 0,  # 'Ф'
-        55: 0,  # 'Ð¥'
-        58: 0,  # 'Ц'
-        50: 0,  # 'Ч'
-        57: 0,  # 'Ш'
-        63: 0,  # 'Щ'
-        62: 0,  # 'Ы'
-        61: 0,  # 'Ь'
-        47: 0,  # 'Э'
-        59: 0,  # 'Ю'
-        43: 0,  # 'Я'
-        3: 0,  # 'а'
-        21: 0,  # 'б'
-        10: 0,  # 'в'
-        19: 0,  # 'г'
-        13: 0,  # 'д'
-        2: 2,  # 'е'
-        24: 0,  # 'ж'
-        20: 0,  # 'з'
-        4: 0,  # 'и'
-        23: 0,  # 'й'
-        11: 0,  # 'к'
-        8: 0,  # 'л'
-        12: 0,  # 'м'
-        5: 0,  # 'н'
-        1: 0,  # 'о'
-        15: 0,  # 'п'
-        9: 0,  # 'Ñ€'
-        7: 0,  # 'Ñ'
-        6: 0,  # 'Ñ‚'
-        14: 0,  # 'у'
-        39: 0,  # 'Ñ„'
-        26: 0,  # 'Ñ…'
-        28: 0,  # 'ц'
-        22: 0,  # 'ч'
-        25: 0,  # 'ш'
-        29: 0,  # 'щ'
-        54: 0,  # 'ÑŠ'
-        18: 0,  # 'Ñ‹'
-        17: 0,  # 'ь'
-        30: 0,  # 'Ñ'
-        27: 1,  # 'ÑŽ'
-        16: 2,  # 'Ñ'
-    },
-    18: {  # 'Ñ‹'
-        37: 0,  # 'Ð'
-        44: 0,  # 'Б'
-        33: 0,  # 'Ð’'
-        46: 0,  # 'Г'
-        41: 0,  # 'Д'
-        48: 0,  # 'Е'
-        56: 0,  # 'Ж'
-        51: 0,  # 'З'
-        42: 0,  # 'И'
-        60: 0,  # 'Й'
-        36: 0,  # 'К'
-        49: 0,  # 'Л'
-        38: 0,  # 'М'
-        31: 0,  # 'Ð'
-        34: 0,  # 'О'
-        35: 0,  # 'П'
-        45: 0,  # 'Р'
-        32: 0,  # 'С'
-        40: 0,  # 'Т'
-        52: 0,  # 'У'
-        53: 0,  # 'Ф'
-        55: 0,  # 'Ð¥'
-        58: 0,  # 'Ц'
-        50: 0,  # 'Ч'
-        57: 0,  # 'Ш'
-        63: 0,  # 'Щ'
-        62: 0,  # 'Ы'
-        61: 0,  # 'Ь'
-        47: 0,  # 'Э'
-        59: 0,  # 'Ю'
-        43: 0,  # 'Я'
-        3: 0,  # 'а'
-        21: 3,  # 'б'
-        10: 3,  # 'в'
-        19: 2,  # 'г'
-        13: 2,  # 'д'
-        2: 3,  # 'е'
-        24: 2,  # 'ж'
-        20: 2,  # 'з'
-        4: 2,  # 'и'
-        23: 3,  # 'й'
-        11: 3,  # 'к'
-        8: 3,  # 'л'
-        12: 3,  # 'м'
-        5: 3,  # 'н'
-        1: 1,  # 'о'
-        15: 3,  # 'п'
-        9: 3,  # 'Ñ€'
-        7: 3,  # 'Ñ'
-        6: 3,  # 'Ñ‚'
-        14: 1,  # 'у'
-        39: 0,  # 'Ñ„'
-        26: 3,  # 'Ñ…'
-        28: 2,  # 'ц'
-        22: 3,  # 'ч'
-        25: 3,  # 'ш'
-        29: 2,  # 'щ'
-        54: 0,  # 'ÑŠ'
-        18: 0,  # 'Ñ‹'
-        17: 0,  # 'ь'
-        30: 0,  # 'Ñ'
-        27: 0,  # 'ÑŽ'
-        16: 2,  # 'Ñ'
-    },
-    17: {  # 'ь'
-        37: 0,  # 'Ð'
-        44: 0,  # 'Б'
-        33: 0,  # 'Ð’'
-        46: 0,  # 'Г'
-        41: 0,  # 'Д'
-        48: 0,  # 'Е'
-        56: 0,  # 'Ж'
-        51: 0,  # 'З'
-        42: 0,  # 'И'
-        60: 0,  # 'Й'
-        36: 0,  # 'К'
-        49: 0,  # 'Л'
-        38: 0,  # 'М'
-        31: 0,  # 'Ð'
-        34: 0,  # 'О'
-        35: 0,  # 'П'
-        45: 0,  # 'Р'
-        32: 0,  # 'С'
-        40: 0,  # 'Т'
-        52: 0,  # 'У'
-        53: 0,  # 'Ф'
-        55: 0,  # 'Ð¥'
-        58: 0,  # 'Ц'
-        50: 0,  # 'Ч'
-        57: 0,  # 'Ш'
-        63: 0,  # 'Щ'
-        62: 0,  # 'Ы'
-        61: 0,  # 'Ь'
-        47: 0,  # 'Э'
-        59: 0,  # 'Ю'
-        43: 0,  # 'Я'
-        3: 0,  # 'а'
-        21: 2,  # 'б'
-        10: 2,  # 'в'
-        19: 2,  # 'г'
-        13: 2,  # 'д'
-        2: 3,  # 'е'
-        24: 1,  # 'ж'
-        20: 3,  # 'з'
-        4: 2,  # 'и'
-        23: 0,  # 'й'
-        11: 3,  # 'к'
-        8: 0,  # 'л'
-        12: 3,  # 'м'
-        5: 3,  # 'н'
-        1: 2,  # 'о'
-        15: 2,  # 'п'
-        9: 1,  # 'Ñ€'
-        7: 3,  # 'Ñ'
-        6: 2,  # 'Ñ‚'
-        14: 0,  # 'у'
-        39: 2,  # 'Ñ„'
-        26: 1,  # 'Ñ…'
-        28: 2,  # 'ц'
-        22: 2,  # 'ч'
-        25: 3,  # 'ш'
-        29: 2,  # 'щ'
-        54: 0,  # 'ÑŠ'
-        18: 0,  # 'Ñ‹'
-        17: 0,  # 'ь'
-        30: 1,  # 'Ñ'
-        27: 3,  # 'ÑŽ'
-        16: 3,  # 'Ñ'
-    },
-    30: {  # 'Ñ'
-        37: 0,  # 'Ð'
-        44: 0,  # 'Б'
-        33: 0,  # 'Ð’'
-        46: 0,  # 'Г'
-        41: 0,  # 'Д'
-        48: 0,  # 'Е'
-        56: 0,  # 'Ж'
-        51: 0,  # 'З'
-        42: 0,  # 'И'
-        60: 0,  # 'Й'
-        36: 0,  # 'К'
-        49: 0,  # 'Л'
-        38: 1,  # 'М'
-        31: 1,  # 'Ð'
-        34: 0,  # 'О'
-        35: 0,  # 'П'
-        45: 1,  # 'Р'
-        32: 1,  # 'С'
-        40: 0,  # 'Т'
-        52: 0,  # 'У'
-        53: 1,  # 'Ф'
-        55: 0,  # 'Ð¥'
-        58: 0,  # 'Ц'
-        50: 0,  # 'Ч'
-        57: 0,  # 'Ш'
-        63: 0,  # 'Щ'
-        62: 0,  # 'Ы'
-        61: 0,  # 'Ь'
-        47: 0,  # 'Э'
-        59: 0,  # 'Ю'
-        43: 0,  # 'Я'
-        3: 0,  # 'а'
-        21: 1,  # 'б'
-        10: 1,  # 'в'
-        19: 1,  # 'г'
-        13: 2,  # 'д'
-        2: 1,  # 'е'
-        24: 0,  # 'ж'
-        20: 1,  # 'з'
-        4: 0,  # 'и'
-        23: 2,  # 'й'
-        11: 2,  # 'к'
-        8: 2,  # 'л'
-        12: 2,  # 'м'
-        5: 2,  # 'н'
-        1: 0,  # 'о'
-        15: 2,  # 'п'
-        9: 2,  # 'Ñ€'
-        7: 2,  # 'Ñ'
-        6: 3,  # 'Ñ‚'
-        14: 1,  # 'у'
-        39: 2,  # 'Ñ„'
-        26: 1,  # 'Ñ…'
-        28: 0,  # 'ц'
-        22: 0,  # 'ч'
-        25: 1,  # 'ш'
-        29: 0,  # 'щ'
-        54: 0,  # 'ÑŠ'
-        18: 0,  # 'Ñ‹'
-        17: 0,  # 'ь'
-        30: 1,  # 'Ñ'
-        27: 1,  # 'ÑŽ'
-        16: 1,  # 'Ñ'
-    },
-    27: {  # 'ÑŽ'
-        37: 0,  # 'Ð'
-        44: 0,  # 'Б'
-        33: 0,  # 'Ð’'
-        46: 0,  # 'Г'
-        41: 0,  # 'Д'
-        48: 0,  # 'Е'
-        56: 0,  # 'Ж'
-        51: 0,  # 'З'
-        42: 0,  # 'И'
-        60: 0,  # 'Й'
-        36: 0,  # 'К'
-        49: 0,  # 'Л'
-        38: 0,  # 'М'
-        31: 0,  # 'Ð'
-        34: 0,  # 'О'
-        35: 0,  # 'П'
-        45: 0,  # 'Р'
-        32: 0,  # 'С'
-        40: 0,  # 'Т'
-        52: 0,  # 'У'
-        53: 0,  # 'Ф'
-        55: 0,  # 'Ð¥'
-        58: 0,  # 'Ц'
-        50: 0,  # 'Ч'
-        57: 0,  # 'Ш'
-        63: 0,  # 'Щ'
-        62: 0,  # 'Ы'
-        61: 0,  # 'Ь'
-        47: 0,  # 'Э'
-        59: 0,  # 'Ю'
-        43: 0,  # 'Я'
-        3: 2,  # 'а'
-        21: 3,  # 'б'
-        10: 1,  # 'в'
-        19: 2,  # 'г'
-        13: 3,  # 'д'
-        2: 1,  # 'е'
-        24: 2,  # 'ж'
-        20: 2,  # 'з'
-        4: 1,  # 'и'
-        23: 1,  # 'й'
-        11: 2,  # 'к'
-        8: 2,  # 'л'
-        12: 2,  # 'м'
-        5: 2,  # 'н'
-        1: 1,  # 'о'
-        15: 2,  # 'п'
-        9: 2,  # 'Ñ€'
-        7: 3,  # 'Ñ'
-        6: 3,  # 'Ñ‚'
-        14: 0,  # 'у'
-        39: 1,  # 'Ñ„'
-        26: 2,  # 'Ñ…'
-        28: 2,  # 'ц'
-        22: 2,  # 'ч'
-        25: 2,  # 'ш'
-        29: 3,  # 'щ'
-        54: 0,  # 'ÑŠ'
-        18: 0,  # 'Ñ‹'
-        17: 0,  # 'ь'
-        30: 1,  # 'Ñ'
-        27: 2,  # 'ÑŽ'
-        16: 1,  # 'Ñ'
-    },
-    16: {  # 'Ñ'
-        37: 0,  # 'Ð'
-        44: 0,  # 'Б'
-        33: 0,  # 'Ð’'
-        46: 0,  # 'Г'
-        41: 0,  # 'Д'
-        48: 0,  # 'Е'
-        56: 0,  # 'Ж'
-        51: 0,  # 'З'
-        42: 0,  # 'И'
-        60: 0,  # 'Й'
-        36: 0,  # 'К'
-        49: 0,  # 'Л'
-        38: 0,  # 'М'
-        31: 0,  # 'Ð'
-        34: 0,  # 'О'
-        35: 0,  # 'П'
-        45: 0,  # 'Р'
-        32: 0,  # 'С'
-        40: 0,  # 'Т'
-        52: 0,  # 'У'
-        53: 0,  # 'Ф'
-        55: 0,  # 'Ð¥'
-        58: 0,  # 'Ц'
-        50: 0,  # 'Ч'
-        57: 0,  # 'Ш'
-        63: 0,  # 'Щ'
-        62: 0,  # 'Ы'
-        61: 0,  # 'Ь'
-        47: 0,  # 'Э'
-        59: 0,  # 'Ю'
-        43: 0,  # 'Я'
-        3: 0,  # 'а'
-        21: 2,  # 'б'
-        10: 3,  # 'в'
-        19: 2,  # 'г'
-        13: 3,  # 'д'
-        2: 3,  # 'е'
-        24: 3,  # 'ж'
-        20: 3,  # 'з'
-        4: 2,  # 'и'
-        23: 2,  # 'й'
-        11: 3,  # 'к'
-        8: 3,  # 'л'
-        12: 3,  # 'м'
-        5: 3,  # 'н'
-        1: 0,  # 'о'
-        15: 2,  # 'п'
-        9: 2,  # 'Ñ€'
-        7: 3,  # 'Ñ'
-        6: 3,  # 'Ñ‚'
-        14: 1,  # 'у'
-        39: 1,  # 'Ñ„'
-        26: 3,  # 'Ñ…'
-        28: 2,  # 'ц'
-        22: 2,  # 'ч'
-        25: 2,  # 'ш'
-        29: 3,  # 'щ'
-        54: 0,  # 'ÑŠ'
-        18: 0,  # 'Ñ‹'
-        17: 0,  # 'ь'
-        30: 0,  # 'Ñ'
-        27: 2,  # 'ÑŽ'
-        16: 2,  # 'Ñ'
-    },
-}
-
-# 255: Undefined characters that did not exist in training text
-# 254: Carriage/Return
-# 253: symbol (punctuation) that does not belong to word
-# 252: 0 - 9
-# 251: Control characters
-
-# Character Mapping Table(s):
-IBM866_RUSSIAN_CHAR_TO_ORDER = {
-     0: 255,  # '\x00'
-     1: 255,  # '\x01'
-     2: 255,  # '\x02'
-     3: 255,  # '\x03'
-     4: 255,  # '\x04'
-     5: 255,  # '\x05'
-     6: 255,  # '\x06'
-     7: 255,  # '\x07'
-     8: 255,  # '\x08'
-     9: 255,  # '\t'
-     10: 254,  # '\n'
-     11: 255,  # '\x0b'
-     12: 255,  # '\x0c'
-     13: 254,  # '\r'
-     14: 255,  # '\x0e'
-     15: 255,  # '\x0f'
-     16: 255,  # '\x10'
-     17: 255,  # '\x11'
-     18: 255,  # '\x12'
-     19: 255,  # '\x13'
-     20: 255,  # '\x14'
-     21: 255,  # '\x15'
-     22: 255,  # '\x16'
-     23: 255,  # '\x17'
-     24: 255,  # '\x18'
-     25: 255,  # '\x19'
-     26: 255,  # '\x1a'
-     27: 255,  # '\x1b'
-     28: 255,  # '\x1c'
-     29: 255,  # '\x1d'
-     30: 255,  # '\x1e'
-     31: 255,  # '\x1f'
-     32: 253,  # ' '
-     33: 253,  # '!'
-     34: 253,  # '"'
-     35: 253,  # '#'
-     36: 253,  # '$'
-     37: 253,  # '%'
-     38: 253,  # '&'
-     39: 253,  # "'"
-     40: 253,  # '('
-     41: 253,  # ')'
-     42: 253,  # '*'
-     43: 253,  # '+'
-     44: 253,  # ','
-     45: 253,  # '-'
-     46: 253,  # '.'
-     47: 253,  # '/'
-     48: 252,  # '0'
-     49: 252,  # '1'
-     50: 252,  # '2'
-     51: 252,  # '3'
-     52: 252,  # '4'
-     53: 252,  # '5'
-     54: 252,  # '6'
-     55: 252,  # '7'
-     56: 252,  # '8'
-     57: 252,  # '9'
-     58: 253,  # ':'
-     59: 253,  # ';'
-     60: 253,  # '<'
-     61: 253,  # '='
-     62: 253,  # '>'
-     63: 253,  # '?'
-     64: 253,  # '@'
-     65: 142,  # 'A'
-     66: 143,  # 'B'
-     67: 144,  # 'C'
-     68: 145,  # 'D'
-     69: 146,  # 'E'
-     70: 147,  # 'F'
-     71: 148,  # 'G'
-     72: 149,  # 'H'
-     73: 150,  # 'I'
-     74: 151,  # 'J'
-     75: 152,  # 'K'
-     76: 74,  # 'L'
-     77: 153,  # 'M'
-     78: 75,  # 'N'
-     79: 154,  # 'O'
-     80: 155,  # 'P'
-     81: 156,  # 'Q'
-     82: 157,  # 'R'
-     83: 158,  # 'S'
-     84: 159,  # 'T'
-     85: 160,  # 'U'
-     86: 161,  # 'V'
-     87: 162,  # 'W'
-     88: 163,  # 'X'
-     89: 164,  # 'Y'
-     90: 165,  # 'Z'
-     91: 253,  # '['
-     92: 253,  # '\\'
-     93: 253,  # ']'
-     94: 253,  # '^'
-     95: 253,  # '_'
-     96: 253,  # '`'
-     97: 71,  # 'a'
-     98: 172,  # 'b'
-     99: 66,  # 'c'
-     100: 173,  # 'd'
-     101: 65,  # 'e'
-     102: 174,  # 'f'
-     103: 76,  # 'g'
-     104: 175,  # 'h'
-     105: 64,  # 'i'
-     106: 176,  # 'j'
-     107: 177,  # 'k'
-     108: 77,  # 'l'
-     109: 72,  # 'm'
-     110: 178,  # 'n'
-     111: 69,  # 'o'
-     112: 67,  # 'p'
-     113: 179,  # 'q'
-     114: 78,  # 'r'
-     115: 73,  # 's'
-     116: 180,  # 't'
-     117: 181,  # 'u'
-     118: 79,  # 'v'
-     119: 182,  # 'w'
-     120: 183,  # 'x'
-     121: 184,  # 'y'
-     122: 185,  # 'z'
-     123: 253,  # '{'
-     124: 253,  # '|'
-     125: 253,  # '}'
-     126: 253,  # '~'
-     127: 253,  # '\x7f'
-     128: 37,  # 'Ð'
-     129: 44,  # 'Б'
-     130: 33,  # 'Ð’'
-     131: 46,  # 'Г'
-     132: 41,  # 'Д'
-     133: 48,  # 'Е'
-     134: 56,  # 'Ж'
-     135: 51,  # 'З'
-     136: 42,  # 'И'
-     137: 60,  # 'Й'
-     138: 36,  # 'К'
-     139: 49,  # 'Л'
-     140: 38,  # 'М'
-     141: 31,  # 'Ð'
-     142: 34,  # 'О'
-     143: 35,  # 'П'
-     144: 45,  # 'Р'
-     145: 32,  # 'С'
-     146: 40,  # 'Т'
-     147: 52,  # 'У'
-     148: 53,  # 'Ф'
-     149: 55,  # 'Ð¥'
-     150: 58,  # 'Ц'
-     151: 50,  # 'Ч'
-     152: 57,  # 'Ш'
-     153: 63,  # 'Щ'
-     154: 70,  # 'Ъ'
-     155: 62,  # 'Ы'
-     156: 61,  # 'Ь'
-     157: 47,  # 'Э'
-     158: 59,  # 'Ю'
-     159: 43,  # 'Я'
-     160: 3,  # 'а'
-     161: 21,  # 'б'
-     162: 10,  # 'в'
-     163: 19,  # 'г'
-     164: 13,  # 'д'
-     165: 2,  # 'е'
-     166: 24,  # 'ж'
-     167: 20,  # 'з'
-     168: 4,  # 'и'
-     169: 23,  # 'й'
-     170: 11,  # 'к'
-     171: 8,  # 'л'
-     172: 12,  # 'м'
-     173: 5,  # 'н'
-     174: 1,  # 'о'
-     175: 15,  # 'п'
-     176: 191,  # 'â–‘'
-     177: 192,  # 'â–’'
-     178: 193,  # 'â–“'
-     179: 194,  # '│'
-     180: 195,  # '┤'
-     181: 196,  # 'â•¡'
-     182: 197,  # 'â•¢'
-     183: 198,  # 'â•–'
-     184: 199,  # 'â••'
-     185: 200,  # 'â•£'
-     186: 201,  # 'â•‘'
-     187: 202,  # 'â•—'
-     188: 203,  # 'â•'
-     189: 204,  # '╜'
-     190: 205,  # 'â•›'
-     191: 206,  # 'â”'
-     192: 207,  # 'â””'
-     193: 208,  # 'â”´'
-     194: 209,  # '┬'
-     195: 210,  # '├'
-     196: 211,  # '─'
-     197: 212,  # '┼'
-     198: 213,  # '╞'
-     199: 214,  # '╟'
-     200: 215,  # '╚'
-     201: 216,  # 'â•”'
-     202: 217,  # 'â•©'
-     203: 218,  # '╦'
-     204: 219,  # 'â• '
-     205: 220,  # 'â•'
-     206: 221,  # '╬'
-     207: 222,  # 'â•§'
-     208: 223,  # '╨'
-     209: 224,  # '╤'
-     210: 225,  # 'â•¥'
-     211: 226,  # 'â•™'
-     212: 227,  # '╘'
-     213: 228,  # 'â•’'
-     214: 229,  # 'â•“'
-     215: 230,  # 'â•«'
-     216: 231,  # '╪'
-     217: 232,  # '┘'
-     218: 233,  # '┌'
-     219: 234,  # 'â–ˆ'
-     220: 235,  # 'â–„'
-     221: 236,  # '▌'
-     222: 237,  # 'â–'
-     223: 238,  # 'â–€'
-     224: 9,  # 'Ñ€'
-     225: 7,  # 'Ñ'
-     226: 6,  # 'Ñ‚'
-     227: 14,  # 'у'
-     228: 39,  # 'Ñ„'
-     229: 26,  # 'Ñ…'
-     230: 28,  # 'ц'
-     231: 22,  # 'ч'
-     232: 25,  # 'ш'
-     233: 29,  # 'щ'
-     234: 54,  # 'ÑŠ'
-     235: 18,  # 'Ñ‹'
-     236: 17,  # 'ь'
-     237: 30,  # 'Ñ'
-     238: 27,  # 'ÑŽ'
-     239: 16,  # 'Ñ'
-     240: 239,  # 'Ð'
-     241: 68,  # 'Ñ‘'
-     242: 240,  # 'Є'
-     243: 241,  # 'Ñ”'
-     244: 242,  # 'Ї'
-     245: 243,  # 'Ñ—'
-     246: 244,  # 'ÐŽ'
-     247: 245,  # 'Ñž'
-     248: 246,  # '°'
-     249: 247,  # '∙'
-     250: 248,  # '·'
-     251: 249,  # '√'
-     252: 250,  # 'â„–'
-     253: 251,  # '¤'
-     254: 252,  # 'â– '
-     255: 255,  # '\xa0'
-}
-
-IBM866_RUSSIAN_MODEL = SingleByteCharSetModel(charset_name='IBM866',
-                                              language='Russian',
-                                              char_to_order_map=IBM866_RUSSIAN_CHAR_TO_ORDER,
-                                              language_model=RUSSIAN_LANG_MODEL,
-                                              typical_positive_ratio=0.976601,
-                                              keep_ascii_letters=False,
-                                              alphabet='ÐÐБВГДЕЖЗИЙКЛМÐОПРСТУФХЦЧШЩЪЫЬЭЮЯабвгдежзийклмнопрÑтуфхцчшщъыьÑÑŽÑÑ‘')
-
-WINDOWS_1251_RUSSIAN_CHAR_TO_ORDER = {
-     0: 255,  # '\x00'
-     1: 255,  # '\x01'
-     2: 255,  # '\x02'
-     3: 255,  # '\x03'
-     4: 255,  # '\x04'
-     5: 255,  # '\x05'
-     6: 255,  # '\x06'
-     7: 255,  # '\x07'
-     8: 255,  # '\x08'
-     9: 255,  # '\t'
-     10: 254,  # '\n'
-     11: 255,  # '\x0b'
-     12: 255,  # '\x0c'
-     13: 254,  # '\r'
-     14: 255,  # '\x0e'
-     15: 255,  # '\x0f'
-     16: 255,  # '\x10'
-     17: 255,  # '\x11'
-     18: 255,  # '\x12'
-     19: 255,  # '\x13'
-     20: 255,  # '\x14'
-     21: 255,  # '\x15'
-     22: 255,  # '\x16'
-     23: 255,  # '\x17'
-     24: 255,  # '\x18'
-     25: 255,  # '\x19'
-     26: 255,  # '\x1a'
-     27: 255,  # '\x1b'
-     28: 255,  # '\x1c'
-     29: 255,  # '\x1d'
-     30: 255,  # '\x1e'
-     31: 255,  # '\x1f'
-     32: 253,  # ' '
-     33: 253,  # '!'
-     34: 253,  # '"'
-     35: 253,  # '#'
-     36: 253,  # '$'
-     37: 253,  # '%'
-     38: 253,  # '&'
-     39: 253,  # "'"
-     40: 253,  # '('
-     41: 253,  # ')'
-     42: 253,  # '*'
-     43: 253,  # '+'
-     44: 253,  # ','
-     45: 253,  # '-'
-     46: 253,  # '.'
-     47: 253,  # '/'
-     48: 252,  # '0'
-     49: 252,  # '1'
-     50: 252,  # '2'
-     51: 252,  # '3'
-     52: 252,  # '4'
-     53: 252,  # '5'
-     54: 252,  # '6'
-     55: 252,  # '7'
-     56: 252,  # '8'
-     57: 252,  # '9'
-     58: 253,  # ':'
-     59: 253,  # ';'
-     60: 253,  # '<'
-     61: 253,  # '='
-     62: 253,  # '>'
-     63: 253,  # '?'
-     64: 253,  # '@'
-     65: 142,  # 'A'
-     66: 143,  # 'B'
-     67: 144,  # 'C'
-     68: 145,  # 'D'
-     69: 146,  # 'E'
-     70: 147,  # 'F'
-     71: 148,  # 'G'
-     72: 149,  # 'H'
-     73: 150,  # 'I'
-     74: 151,  # 'J'
-     75: 152,  # 'K'
-     76: 74,  # 'L'
-     77: 153,  # 'M'
-     78: 75,  # 'N'
-     79: 154,  # 'O'
-     80: 155,  # 'P'
-     81: 156,  # 'Q'
-     82: 157,  # 'R'
-     83: 158,  # 'S'
-     84: 159,  # 'T'
-     85: 160,  # 'U'
-     86: 161,  # 'V'
-     87: 162,  # 'W'
-     88: 163,  # 'X'
-     89: 164,  # 'Y'
-     90: 165,  # 'Z'
-     91: 253,  # '['
-     92: 253,  # '\\'
-     93: 253,  # ']'
-     94: 253,  # '^'
-     95: 253,  # '_'
-     96: 253,  # '`'
-     97: 71,  # 'a'
-     98: 172,  # 'b'
-     99: 66,  # 'c'
-     100: 173,  # 'd'
-     101: 65,  # 'e'
-     102: 174,  # 'f'
-     103: 76,  # 'g'
-     104: 175,  # 'h'
-     105: 64,  # 'i'
-     106: 176,  # 'j'
-     107: 177,  # 'k'
-     108: 77,  # 'l'
-     109: 72,  # 'm'
-     110: 178,  # 'n'
-     111: 69,  # 'o'
-     112: 67,  # 'p'
-     113: 179,  # 'q'
-     114: 78,  # 'r'
-     115: 73,  # 's'
-     116: 180,  # 't'
-     117: 181,  # 'u'
-     118: 79,  # 'v'
-     119: 182,  # 'w'
-     120: 183,  # 'x'
-     121: 184,  # 'y'
-     122: 185,  # 'z'
-     123: 253,  # '{'
-     124: 253,  # '|'
-     125: 253,  # '}'
-     126: 253,  # '~'
-     127: 253,  # '\x7f'
-     128: 191,  # 'Ђ'
-     129: 192,  # 'Ѓ'
-     130: 193,  # '‚'
-     131: 194,  # 'Ñ“'
-     132: 195,  # '„'
-     133: 196,  # '…'
-     134: 197,  # '†'
-     135: 198,  # '‡'
-     136: 199,  # '€'
-     137: 200,  # '‰'
-     138: 201,  # 'Љ'
-     139: 202,  # '‹'
-     140: 203,  # 'Њ'
-     141: 204,  # 'Ќ'
-     142: 205,  # 'Ћ'
-     143: 206,  # 'Ð'
-     144: 207,  # 'Ñ’'
-     145: 208,  # '‘'
-     146: 209,  # '’'
-     147: 210,  # '“'
-     148: 211,  # 'â€'
-     149: 212,  # '•'
-     150: 213,  # '–'
-     151: 214,  # '—'
-     152: 215,  # None
-     153: 216,  # 'â„¢'
-     154: 217,  # 'Ñ™'
-     155: 218,  # '›'
-     156: 219,  # 'Ñš'
-     157: 220,  # 'ќ'
-     158: 221,  # 'Ñ›'
-     159: 222,  # 'ÑŸ'
-     160: 223,  # '\xa0'
-     161: 224,  # 'ÐŽ'
-     162: 225,  # 'Ñž'
-     163: 226,  # 'Ј'
-     164: 227,  # '¤'
-     165: 228,  # 'Ò'
-     166: 229,  # '¦'
-     167: 230,  # '§'
-     168: 231,  # 'Ð'
-     169: 232,  # '©'
-     170: 233,  # 'Є'
-     171: 234,  # '«'
-     172: 235,  # '¬'
-     173: 236,  # '\xad'
-     174: 237,  # '®'
-     175: 238,  # 'Ї'
-     176: 239,  # '°'
-     177: 240,  # '±'
-     178: 241,  # 'І'
-     179: 242,  # 'Ñ–'
-     180: 243,  # 'Ò‘'
-     181: 244,  # 'µ'
-     182: 245,  # '¶'
-     183: 246,  # '·'
-     184: 68,  # 'Ñ‘'
-     185: 247,  # 'â„–'
-     186: 248,  # 'Ñ”'
-     187: 249,  # '»'
-     188: 250,  # 'ј'
-     189: 251,  # 'Ð…'
-     190: 252,  # 'Ñ•'
-     191: 253,  # 'Ñ—'
-     192: 37,  # 'Ð'
-     193: 44,  # 'Б'
-     194: 33,  # 'Ð’'
-     195: 46,  # 'Г'
-     196: 41,  # 'Д'
-     197: 48,  # 'Е'
-     198: 56,  # 'Ж'
-     199: 51,  # 'З'
-     200: 42,  # 'И'
-     201: 60,  # 'Й'
-     202: 36,  # 'К'
-     203: 49,  # 'Л'
-     204: 38,  # 'М'
-     205: 31,  # 'Ð'
-     206: 34,  # 'О'
-     207: 35,  # 'П'
-     208: 45,  # 'Р'
-     209: 32,  # 'С'
-     210: 40,  # 'Т'
-     211: 52,  # 'У'
-     212: 53,  # 'Ф'
-     213: 55,  # 'Ð¥'
-     214: 58,  # 'Ц'
-     215: 50,  # 'Ч'
-     216: 57,  # 'Ш'
-     217: 63,  # 'Щ'
-     218: 70,  # 'Ъ'
-     219: 62,  # 'Ы'
-     220: 61,  # 'Ь'
-     221: 47,  # 'Э'
-     222: 59,  # 'Ю'
-     223: 43,  # 'Я'
-     224: 3,  # 'а'
-     225: 21,  # 'б'
-     226: 10,  # 'в'
-     227: 19,  # 'г'
-     228: 13,  # 'д'
-     229: 2,  # 'е'
-     230: 24,  # 'ж'
-     231: 20,  # 'з'
-     232: 4,  # 'и'
-     233: 23,  # 'й'
-     234: 11,  # 'к'
-     235: 8,  # 'л'
-     236: 12,  # 'м'
-     237: 5,  # 'н'
-     238: 1,  # 'о'
-     239: 15,  # 'п'
-     240: 9,  # 'Ñ€'
-     241: 7,  # 'Ñ'
-     242: 6,  # 'Ñ‚'
-     243: 14,  # 'у'
-     244: 39,  # 'Ñ„'
-     245: 26,  # 'Ñ…'
-     246: 28,  # 'ц'
-     247: 22,  # 'ч'
-     248: 25,  # 'ш'
-     249: 29,  # 'щ'
-     250: 54,  # 'ÑŠ'
-     251: 18,  # 'Ñ‹'
-     252: 17,  # 'ь'
-     253: 30,  # 'Ñ'
-     254: 27,  # 'ÑŽ'
-     255: 16,  # 'Ñ'
-}
-
-WINDOWS_1251_RUSSIAN_MODEL = SingleByteCharSetModel(charset_name='windows-1251',
-                                                    language='Russian',
-                                                    char_to_order_map=WINDOWS_1251_RUSSIAN_CHAR_TO_ORDER,
-                                                    language_model=RUSSIAN_LANG_MODEL,
-                                                    typical_positive_ratio=0.976601,
-                                                    keep_ascii_letters=False,
-                                                    alphabet='ÐÐБВГДЕЖЗИЙКЛМÐОПРСТУФХЦЧШЩЪЫЬЭЮЯабвгдежзийклмнопрÑтуфхцчшщъыьÑÑŽÑÑ‘')
-
-IBM855_RUSSIAN_CHAR_TO_ORDER = {
-     0: 255,  # '\x00'
-     1: 255,  # '\x01'
-     2: 255,  # '\x02'
-     3: 255,  # '\x03'
-     4: 255,  # '\x04'
-     5: 255,  # '\x05'
-     6: 255,  # '\x06'
-     7: 255,  # '\x07'
-     8: 255,  # '\x08'
-     9: 255,  # '\t'
-     10: 254,  # '\n'
-     11: 255,  # '\x0b'
-     12: 255,  # '\x0c'
-     13: 254,  # '\r'
-     14: 255,  # '\x0e'
-     15: 255,  # '\x0f'
-     16: 255,  # '\x10'
-     17: 255,  # '\x11'
-     18: 255,  # '\x12'
-     19: 255,  # '\x13'
-     20: 255,  # '\x14'
-     21: 255,  # '\x15'
-     22: 255,  # '\x16'
-     23: 255,  # '\x17'
-     24: 255,  # '\x18'
-     25: 255,  # '\x19'
-     26: 255,  # '\x1a'
-     27: 255,  # '\x1b'
-     28: 255,  # '\x1c'
-     29: 255,  # '\x1d'
-     30: 255,  # '\x1e'
-     31: 255,  # '\x1f'
-     32: 253,  # ' '
-     33: 253,  # '!'
-     34: 253,  # '"'
-     35: 253,  # '#'
-     36: 253,  # '$'
-     37: 253,  # '%'
-     38: 253,  # '&'
-     39: 253,  # "'"
-     40: 253,  # '('
-     41: 253,  # ')'
-     42: 253,  # '*'
-     43: 253,  # '+'
-     44: 253,  # ','
-     45: 253,  # '-'
-     46: 253,  # '.'
-     47: 253,  # '/'
-     48: 252,  # '0'
-     49: 252,  # '1'
-     50: 252,  # '2'
-     51: 252,  # '3'
-     52: 252,  # '4'
-     53: 252,  # '5'
-     54: 252,  # '6'
-     55: 252,  # '7'
-     56: 252,  # '8'
-     57: 252,  # '9'
-     58: 253,  # ':'
-     59: 253,  # ';'
-     60: 253,  # '<'
-     61: 253,  # '='
-     62: 253,  # '>'
-     63: 253,  # '?'
-     64: 253,  # '@'
-     65: 142,  # 'A'
-     66: 143,  # 'B'
-     67: 144,  # 'C'
-     68: 145,  # 'D'
-     69: 146,  # 'E'
-     70: 147,  # 'F'
-     71: 148,  # 'G'
-     72: 149,  # 'H'
-     73: 150,  # 'I'
-     74: 151,  # 'J'
-     75: 152,  # 'K'
-     76: 74,  # 'L'
-     77: 153,  # 'M'
-     78: 75,  # 'N'
-     79: 154,  # 'O'
-     80: 155,  # 'P'
-     81: 156,  # 'Q'
-     82: 157,  # 'R'
-     83: 158,  # 'S'
-     84: 159,  # 'T'
-     85: 160,  # 'U'
-     86: 161,  # 'V'
-     87: 162,  # 'W'
-     88: 163,  # 'X'
-     89: 164,  # 'Y'
-     90: 165,  # 'Z'
-     91: 253,  # '['
-     92: 253,  # '\\'
-     93: 253,  # ']'
-     94: 253,  # '^'
-     95: 253,  # '_'
-     96: 253,  # '`'
-     97: 71,  # 'a'
-     98: 172,  # 'b'
-     99: 66,  # 'c'
-     100: 173,  # 'd'
-     101: 65,  # 'e'
-     102: 174,  # 'f'
-     103: 76,  # 'g'
-     104: 175,  # 'h'
-     105: 64,  # 'i'
-     106: 176,  # 'j'
-     107: 177,  # 'k'
-     108: 77,  # 'l'
-     109: 72,  # 'm'
-     110: 178,  # 'n'
-     111: 69,  # 'o'
-     112: 67,  # 'p'
-     113: 179,  # 'q'
-     114: 78,  # 'r'
-     115: 73,  # 's'
-     116: 180,  # 't'
-     117: 181,  # 'u'
-     118: 79,  # 'v'
-     119: 182,  # 'w'
-     120: 183,  # 'x'
-     121: 184,  # 'y'
-     122: 185,  # 'z'
-     123: 253,  # '{'
-     124: 253,  # '|'
-     125: 253,  # '}'
-     126: 253,  # '~'
-     127: 253,  # '\x7f'
-     128: 191,  # 'Ñ’'
-     129: 192,  # 'Ђ'
-     130: 193,  # 'Ñ“'
-     131: 194,  # 'Ѓ'
-     132: 68,  # 'Ñ‘'
-     133: 195,  # 'Ð'
-     134: 196,  # 'Ñ”'
-     135: 197,  # 'Є'
-     136: 198,  # 'Ñ•'
-     137: 199,  # 'Ð…'
-     138: 200,  # 'Ñ–'
-     139: 201,  # 'І'
-     140: 202,  # 'Ñ—'
-     141: 203,  # 'Ї'
-     142: 204,  # 'ј'
-     143: 205,  # 'Ј'
-     144: 206,  # 'Ñ™'
-     145: 207,  # 'Љ'
-     146: 208,  # 'Ñš'
-     147: 209,  # 'Њ'
-     148: 210,  # 'Ñ›'
-     149: 211,  # 'Ћ'
-     150: 212,  # 'ќ'
-     151: 213,  # 'Ќ'
-     152: 214,  # 'Ñž'
-     153: 215,  # 'ÐŽ'
-     154: 216,  # 'ÑŸ'
-     155: 217,  # 'Ð'
-     156: 27,  # 'ÑŽ'
-     157: 59,  # 'Ю'
-     158: 54,  # 'ÑŠ'
-     159: 70,  # 'Ъ'
-     160: 3,  # 'а'
-     161: 37,  # 'Ð'
-     162: 21,  # 'б'
-     163: 44,  # 'Б'
-     164: 28,  # 'ц'
-     165: 58,  # 'Ц'
-     166: 13,  # 'д'
-     167: 41,  # 'Д'
-     168: 2,  # 'е'
-     169: 48,  # 'Е'
-     170: 39,  # 'Ñ„'
-     171: 53,  # 'Ф'
-     172: 19,  # 'г'
-     173: 46,  # 'Г'
-     174: 218,  # '«'
-     175: 219,  # '»'
-     176: 220,  # 'â–‘'
-     177: 221,  # 'â–’'
-     178: 222,  # 'â–“'
-     179: 223,  # '│'
-     180: 224,  # '┤'
-     181: 26,  # 'Ñ…'
-     182: 55,  # 'Ð¥'
-     183: 4,  # 'и'
-     184: 42,  # 'И'
-     185: 225,  # 'â•£'
-     186: 226,  # 'â•‘'
-     187: 227,  # 'â•—'
-     188: 228,  # 'â•'
-     189: 23,  # 'й'
-     190: 60,  # 'Й'
-     191: 229,  # 'â”'
-     192: 230,  # 'â””'
-     193: 231,  # 'â”´'
-     194: 232,  # '┬'
-     195: 233,  # '├'
-     196: 234,  # '─'
-     197: 235,  # '┼'
-     198: 11,  # 'к'
-     199: 36,  # 'К'
-     200: 236,  # '╚'
-     201: 237,  # 'â•”'
-     202: 238,  # 'â•©'
-     203: 239,  # '╦'
-     204: 240,  # 'â• '
-     205: 241,  # 'â•'
-     206: 242,  # '╬'
-     207: 243,  # '¤'
-     208: 8,  # 'л'
-     209: 49,  # 'Л'
-     210: 12,  # 'м'
-     211: 38,  # 'М'
-     212: 5,  # 'н'
-     213: 31,  # 'Ð'
-     214: 1,  # 'о'
-     215: 34,  # 'О'
-     216: 15,  # 'п'
-     217: 244,  # '┘'
-     218: 245,  # '┌'
-     219: 246,  # 'â–ˆ'
-     220: 247,  # 'â–„'
-     221: 35,  # 'П'
-     222: 16,  # 'Ñ'
-     223: 248,  # 'â–€'
-     224: 43,  # 'Я'
-     225: 9,  # 'Ñ€'
-     226: 45,  # 'Р'
-     227: 7,  # 'Ñ'
-     228: 32,  # 'С'
-     229: 6,  # 'Ñ‚'
-     230: 40,  # 'Т'
-     231: 14,  # 'у'
-     232: 52,  # 'У'
-     233: 24,  # 'ж'
-     234: 56,  # 'Ж'
-     235: 10,  # 'в'
-     236: 33,  # 'Ð’'
-     237: 17,  # 'ь'
-     238: 61,  # 'Ь'
-     239: 249,  # 'â„–'
-     240: 250,  # '\xad'
-     241: 18,  # 'Ñ‹'
-     242: 62,  # 'Ы'
-     243: 20,  # 'з'
-     244: 51,  # 'З'
-     245: 25,  # 'ш'
-     246: 57,  # 'Ш'
-     247: 30,  # 'Ñ'
-     248: 47,  # 'Э'
-     249: 29,  # 'щ'
-     250: 63,  # 'Щ'
-     251: 22,  # 'ч'
-     252: 50,  # 'Ч'
-     253: 251,  # '§'
-     254: 252,  # 'â– '
-     255: 255,  # '\xa0'
-}
-
-IBM855_RUSSIAN_MODEL = SingleByteCharSetModel(charset_name='IBM855',
-                                              language='Russian',
-                                              char_to_order_map=IBM855_RUSSIAN_CHAR_TO_ORDER,
-                                              language_model=RUSSIAN_LANG_MODEL,
-                                              typical_positive_ratio=0.976601,
-                                              keep_ascii_letters=False,
-                                              alphabet='ÐÐБВГДЕЖЗИЙКЛМÐОПРСТУФХЦЧШЩЪЫЬЭЮЯабвгдежзийклмнопрÑтуфхцчшщъыьÑÑŽÑÑ‘')
-
-KOI8_R_RUSSIAN_CHAR_TO_ORDER = {
-     0: 255,  # '\x00'
-     1: 255,  # '\x01'
-     2: 255,  # '\x02'
-     3: 255,  # '\x03'
-     4: 255,  # '\x04'
-     5: 255,  # '\x05'
-     6: 255,  # '\x06'
-     7: 255,  # '\x07'
-     8: 255,  # '\x08'
-     9: 255,  # '\t'
-     10: 254,  # '\n'
-     11: 255,  # '\x0b'
-     12: 255,  # '\x0c'
-     13: 254,  # '\r'
-     14: 255,  # '\x0e'
-     15: 255,  # '\x0f'
-     16: 255,  # '\x10'
-     17: 255,  # '\x11'
-     18: 255,  # '\x12'
-     19: 255,  # '\x13'
-     20: 255,  # '\x14'
-     21: 255,  # '\x15'
-     22: 255,  # '\x16'
-     23: 255,  # '\x17'
-     24: 255,  # '\x18'
-     25: 255,  # '\x19'
-     26: 255,  # '\x1a'
-     27: 255,  # '\x1b'
-     28: 255,  # '\x1c'
-     29: 255,  # '\x1d'
-     30: 255,  # '\x1e'
-     31: 255,  # '\x1f'
-     32: 253,  # ' '
-     33: 253,  # '!'
-     34: 253,  # '"'
-     35: 253,  # '#'
-     36: 253,  # '$'
-     37: 253,  # '%'
-     38: 253,  # '&'
-     39: 253,  # "'"
-     40: 253,  # '('
-     41: 253,  # ')'
-     42: 253,  # '*'
-     43: 253,  # '+'
-     44: 253,  # ','
-     45: 253,  # '-'
-     46: 253,  # '.'
-     47: 253,  # '/'
-     48: 252,  # '0'
-     49: 252,  # '1'
-     50: 252,  # '2'
-     51: 252,  # '3'
-     52: 252,  # '4'
-     53: 252,  # '5'
-     54: 252,  # '6'
-     55: 252,  # '7'
-     56: 252,  # '8'
-     57: 252,  # '9'
-     58: 253,  # ':'
-     59: 253,  # ';'
-     60: 253,  # '<'
-     61: 253,  # '='
-     62: 253,  # '>'
-     63: 253,  # '?'
-     64: 253,  # '@'
-     65: 142,  # 'A'
-     66: 143,  # 'B'
-     67: 144,  # 'C'
-     68: 145,  # 'D'
-     69: 146,  # 'E'
-     70: 147,  # 'F'
-     71: 148,  # 'G'
-     72: 149,  # 'H'
-     73: 150,  # 'I'
-     74: 151,  # 'J'
-     75: 152,  # 'K'
-     76: 74,  # 'L'
-     77: 153,  # 'M'
-     78: 75,  # 'N'
-     79: 154,  # 'O'
-     80: 155,  # 'P'
-     81: 156,  # 'Q'
-     82: 157,  # 'R'
-     83: 158,  # 'S'
-     84: 159,  # 'T'
-     85: 160,  # 'U'
-     86: 161,  # 'V'
-     87: 162,  # 'W'
-     88: 163,  # 'X'
-     89: 164,  # 'Y'
-     90: 165,  # 'Z'
-     91: 253,  # '['
-     92: 253,  # '\\'
-     93: 253,  # ']'
-     94: 253,  # '^'
-     95: 253,  # '_'
-     96: 253,  # '`'
-     97: 71,  # 'a'
-     98: 172,  # 'b'
-     99: 66,  # 'c'
-     100: 173,  # 'd'
-     101: 65,  # 'e'
-     102: 174,  # 'f'
-     103: 76,  # 'g'
-     104: 175,  # 'h'
-     105: 64,  # 'i'
-     106: 176,  # 'j'
-     107: 177,  # 'k'
-     108: 77,  # 'l'
-     109: 72,  # 'm'
-     110: 178,  # 'n'
-     111: 69,  # 'o'
-     112: 67,  # 'p'
-     113: 179,  # 'q'
-     114: 78,  # 'r'
-     115: 73,  # 's'
-     116: 180,  # 't'
-     117: 181,  # 'u'
-     118: 79,  # 'v'
-     119: 182,  # 'w'
-     120: 183,  # 'x'
-     121: 184,  # 'y'
-     122: 185,  # 'z'
-     123: 253,  # '{'
-     124: 253,  # '|'
-     125: 253,  # '}'
-     126: 253,  # '~'
-     127: 253,  # '\x7f'
-     128: 191,  # '─'
-     129: 192,  # '│'
-     130: 193,  # '┌'
-     131: 194,  # 'â”'
-     132: 195,  # 'â””'
-     133: 196,  # '┘'
-     134: 197,  # '├'
-     135: 198,  # '┤'
-     136: 199,  # '┬'
-     137: 200,  # 'â”´'
-     138: 201,  # '┼'
-     139: 202,  # 'â–€'
-     140: 203,  # 'â–„'
-     141: 204,  # 'â–ˆ'
-     142: 205,  # '▌'
-     143: 206,  # 'â–'
-     144: 207,  # 'â–‘'
-     145: 208,  # 'â–’'
-     146: 209,  # 'â–“'
-     147: 210,  # '⌠'
-     148: 211,  # 'â– '
-     149: 212,  # '∙'
-     150: 213,  # '√'
-     151: 214,  # '≈'
-     152: 215,  # '≤'
-     153: 216,  # '≥'
-     154: 217,  # '\xa0'
-     155: 218,  # '⌡'
-     156: 219,  # '°'
-     157: 220,  # '²'
-     158: 221,  # '·'
-     159: 222,  # '÷'
-     160: 223,  # 'â•'
-     161: 224,  # 'â•‘'
-     162: 225,  # 'â•’'
-     163: 68,  # 'Ñ‘'
-     164: 226,  # 'â•“'
-     165: 227,  # 'â•”'
-     166: 228,  # 'â••'
-     167: 229,  # 'â•–'
-     168: 230,  # 'â•—'
-     169: 231,  # '╘'
-     170: 232,  # 'â•™'
-     171: 233,  # '╚'
-     172: 234,  # 'â•›'
-     173: 235,  # '╜'
-     174: 236,  # 'â•'
-     175: 237,  # '╞'
-     176: 238,  # '╟'
-     177: 239,  # 'â• '
-     178: 240,  # 'â•¡'
-     179: 241,  # 'Ð'
-     180: 242,  # 'â•¢'
-     181: 243,  # 'â•£'
-     182: 244,  # '╤'
-     183: 245,  # 'â•¥'
-     184: 246,  # '╦'
-     185: 247,  # 'â•§'
-     186: 248,  # '╨'
-     187: 249,  # 'â•©'
-     188: 250,  # '╪'
-     189: 251,  # 'â•«'
-     190: 252,  # '╬'
-     191: 253,  # '©'
-     192: 27,  # 'ÑŽ'
-     193: 3,  # 'а'
-     194: 21,  # 'б'
-     195: 28,  # 'ц'
-     196: 13,  # 'д'
-     197: 2,  # 'е'
-     198: 39,  # 'Ñ„'
-     199: 19,  # 'г'
-     200: 26,  # 'Ñ…'
-     201: 4,  # 'и'
-     202: 23,  # 'й'
-     203: 11,  # 'к'
-     204: 8,  # 'л'
-     205: 12,  # 'м'
-     206: 5,  # 'н'
-     207: 1,  # 'о'
-     208: 15,  # 'п'
-     209: 16,  # 'Ñ'
-     210: 9,  # 'Ñ€'
-     211: 7,  # 'Ñ'
-     212: 6,  # 'Ñ‚'
-     213: 14,  # 'у'
-     214: 24,  # 'ж'
-     215: 10,  # 'в'
-     216: 17,  # 'ь'
-     217: 18,  # 'Ñ‹'
-     218: 20,  # 'з'
-     219: 25,  # 'ш'
-     220: 30,  # 'Ñ'
-     221: 29,  # 'щ'
-     222: 22,  # 'ч'
-     223: 54,  # 'ÑŠ'
-     224: 59,  # 'Ю'
-     225: 37,  # 'Ð'
-     226: 44,  # 'Б'
-     227: 58,  # 'Ц'
-     228: 41,  # 'Д'
-     229: 48,  # 'Е'
-     230: 53,  # 'Ф'
-     231: 46,  # 'Г'
-     232: 55,  # 'Ð¥'
-     233: 42,  # 'И'
-     234: 60,  # 'Й'
-     235: 36,  # 'К'
-     236: 49,  # 'Л'
-     237: 38,  # 'М'
-     238: 31,  # 'Ð'
-     239: 34,  # 'О'
-     240: 35,  # 'П'
-     241: 43,  # 'Я'
-     242: 45,  # 'Р'
-     243: 32,  # 'С'
-     244: 40,  # 'Т'
-     245: 52,  # 'У'
-     246: 56,  # 'Ж'
-     247: 33,  # 'Ð’'
-     248: 61,  # 'Ь'
-     249: 62,  # 'Ы'
-     250: 51,  # 'З'
-     251: 57,  # 'Ш'
-     252: 47,  # 'Э'
-     253: 63,  # 'Щ'
-     254: 50,  # 'Ч'
-     255: 70,  # 'Ъ'
-}
-
-KOI8_R_RUSSIAN_MODEL = SingleByteCharSetModel(charset_name='KOI8-R',
-                                              language='Russian',
-                                              char_to_order_map=KOI8_R_RUSSIAN_CHAR_TO_ORDER,
-                                              language_model=RUSSIAN_LANG_MODEL,
-                                              typical_positive_ratio=0.976601,
-                                              keep_ascii_letters=False,
-                                              alphabet='ÐÐБВГДЕЖЗИЙКЛМÐОПРСТУФХЦЧШЩЪЫЬЭЮЯабвгдежзийклмнопрÑтуфхцчшщъыьÑÑŽÑÑ‘')
-
-MACCYRILLIC_RUSSIAN_CHAR_TO_ORDER = {
-     0: 255,  # '\x00'
-     1: 255,  # '\x01'
-     2: 255,  # '\x02'
-     3: 255,  # '\x03'
-     4: 255,  # '\x04'
-     5: 255,  # '\x05'
-     6: 255,  # '\x06'
-     7: 255,  # '\x07'
-     8: 255,  # '\x08'
-     9: 255,  # '\t'
-     10: 254,  # '\n'
-     11: 255,  # '\x0b'
-     12: 255,  # '\x0c'
-     13: 254,  # '\r'
-     14: 255,  # '\x0e'
-     15: 255,  # '\x0f'
-     16: 255,  # '\x10'
-     17: 255,  # '\x11'
-     18: 255,  # '\x12'
-     19: 255,  # '\x13'
-     20: 255,  # '\x14'
-     21: 255,  # '\x15'
-     22: 255,  # '\x16'
-     23: 255,  # '\x17'
-     24: 255,  # '\x18'
-     25: 255,  # '\x19'
-     26: 255,  # '\x1a'
-     27: 255,  # '\x1b'
-     28: 255,  # '\x1c'
-     29: 255,  # '\x1d'
-     30: 255,  # '\x1e'
-     31: 255,  # '\x1f'
-     32: 253,  # ' '
-     33: 253,  # '!'
-     34: 253,  # '"'
-     35: 253,  # '#'
-     36: 253,  # '$'
-     37: 253,  # '%'
-     38: 253,  # '&'
-     39: 253,  # "'"
-     40: 253,  # '('
-     41: 253,  # ')'
-     42: 253,  # '*'
-     43: 253,  # '+'
-     44: 253,  # ','
-     45: 253,  # '-'
-     46: 253,  # '.'
-     47: 253,  # '/'
-     48: 252,  # '0'
-     49: 252,  # '1'
-     50: 252,  # '2'
-     51: 252,  # '3'
-     52: 252,  # '4'
-     53: 252,  # '5'
-     54: 252,  # '6'
-     55: 252,  # '7'
-     56: 252,  # '8'
-     57: 252,  # '9'
-     58: 253,  # ':'
-     59: 253,  # ';'
-     60: 253,  # '<'
-     61: 253,  # '='
-     62: 253,  # '>'
-     63: 253,  # '?'
-     64: 253,  # '@'
-     65: 142,  # 'A'
-     66: 143,  # 'B'
-     67: 144,  # 'C'
-     68: 145,  # 'D'
-     69: 146,  # 'E'
-     70: 147,  # 'F'
-     71: 148,  # 'G'
-     72: 149,  # 'H'
-     73: 150,  # 'I'
-     74: 151,  # 'J'
-     75: 152,  # 'K'
-     76: 74,  # 'L'
-     77: 153,  # 'M'
-     78: 75,  # 'N'
-     79: 154,  # 'O'
-     80: 155,  # 'P'
-     81: 156,  # 'Q'
-     82: 157,  # 'R'
-     83: 158,  # 'S'
-     84: 159,  # 'T'
-     85: 160,  # 'U'
-     86: 161,  # 'V'
-     87: 162,  # 'W'
-     88: 163,  # 'X'
-     89: 164,  # 'Y'
-     90: 165,  # 'Z'
-     91: 253,  # '['
-     92: 253,  # '\\'
-     93: 253,  # ']'
-     94: 253,  # '^'
-     95: 253,  # '_'
-     96: 253,  # '`'
-     97: 71,  # 'a'
-     98: 172,  # 'b'
-     99: 66,  # 'c'
-     100: 173,  # 'd'
-     101: 65,  # 'e'
-     102: 174,  # 'f'
-     103: 76,  # 'g'
-     104: 175,  # 'h'
-     105: 64,  # 'i'
-     106: 176,  # 'j'
-     107: 177,  # 'k'
-     108: 77,  # 'l'
-     109: 72,  # 'm'
-     110: 178,  # 'n'
-     111: 69,  # 'o'
-     112: 67,  # 'p'
-     113: 179,  # 'q'
-     114: 78,  # 'r'
-     115: 73,  # 's'
-     116: 180,  # 't'
-     117: 181,  # 'u'
-     118: 79,  # 'v'
-     119: 182,  # 'w'
-     120: 183,  # 'x'
-     121: 184,  # 'y'
-     122: 185,  # 'z'
-     123: 253,  # '{'
-     124: 253,  # '|'
-     125: 253,  # '}'
-     126: 253,  # '~'
-     127: 253,  # '\x7f'
-     128: 37,  # 'Ð'
-     129: 44,  # 'Б'
-     130: 33,  # 'Ð’'
-     131: 46,  # 'Г'
-     132: 41,  # 'Д'
-     133: 48,  # 'Е'
-     134: 56,  # 'Ж'
-     135: 51,  # 'З'
-     136: 42,  # 'И'
-     137: 60,  # 'Й'
-     138: 36,  # 'К'
-     139: 49,  # 'Л'
-     140: 38,  # 'М'
-     141: 31,  # 'Ð'
-     142: 34,  # 'О'
-     143: 35,  # 'П'
-     144: 45,  # 'Р'
-     145: 32,  # 'С'
-     146: 40,  # 'Т'
-     147: 52,  # 'У'
-     148: 53,  # 'Ф'
-     149: 55,  # 'Ð¥'
-     150: 58,  # 'Ц'
-     151: 50,  # 'Ч'
-     152: 57,  # 'Ш'
-     153: 63,  # 'Щ'
-     154: 70,  # 'Ъ'
-     155: 62,  # 'Ы'
-     156: 61,  # 'Ь'
-     157: 47,  # 'Э'
-     158: 59,  # 'Ю'
-     159: 43,  # 'Я'
-     160: 191,  # '†'
-     161: 192,  # '°'
-     162: 193,  # 'Ò'
-     163: 194,  # '£'
-     164: 195,  # '§'
-     165: 196,  # '•'
-     166: 197,  # '¶'
-     167: 198,  # 'І'
-     168: 199,  # '®'
-     169: 200,  # '©'
-     170: 201,  # 'â„¢'
-     171: 202,  # 'Ђ'
-     172: 203,  # 'Ñ’'
-     173: 204,  # '≠'
-     174: 205,  # 'Ѓ'
-     175: 206,  # 'Ñ“'
-     176: 207,  # '∞'
-     177: 208,  # '±'
-     178: 209,  # '≤'
-     179: 210,  # '≥'
-     180: 211,  # 'Ñ–'
-     181: 212,  # 'µ'
-     182: 213,  # 'Ò‘'
-     183: 214,  # 'Ј'
-     184: 215,  # 'Є'
-     185: 216,  # 'Ñ”'
-     186: 217,  # 'Ї'
-     187: 218,  # 'Ñ—'
-     188: 219,  # 'Љ'
-     189: 220,  # 'Ñ™'
-     190: 221,  # 'Њ'
-     191: 222,  # 'Ñš'
-     192: 223,  # 'ј'
-     193: 224,  # 'Ð…'
-     194: 225,  # '¬'
-     195: 226,  # '√'
-     196: 227,  # 'Æ’'
-     197: 228,  # '≈'
-     198: 229,  # '∆'
-     199: 230,  # '«'
-     200: 231,  # '»'
-     201: 232,  # '…'
-     202: 233,  # '\xa0'
-     203: 234,  # 'Ћ'
-     204: 235,  # 'Ñ›'
-     205: 236,  # 'Ќ'
-     206: 237,  # 'ќ'
-     207: 238,  # 'Ñ•'
-     208: 239,  # '–'
-     209: 240,  # '—'
-     210: 241,  # '“'
-     211: 242,  # 'â€'
-     212: 243,  # '‘'
-     213: 244,  # '’'
-     214: 245,  # '÷'
-     215: 246,  # '„'
-     216: 247,  # 'ÐŽ'
-     217: 248,  # 'Ñž'
-     218: 249,  # 'Ð'
-     219: 250,  # 'ÑŸ'
-     220: 251,  # 'â„–'
-     221: 252,  # 'Ð'
-     222: 68,  # 'Ñ‘'
-     223: 16,  # 'Ñ'
-     224: 3,  # 'а'
-     225: 21,  # 'б'
-     226: 10,  # 'в'
-     227: 19,  # 'г'
-     228: 13,  # 'д'
-     229: 2,  # 'е'
-     230: 24,  # 'ж'
-     231: 20,  # 'з'
-     232: 4,  # 'и'
-     233: 23,  # 'й'
-     234: 11,  # 'к'
-     235: 8,  # 'л'
-     236: 12,  # 'м'
-     237: 5,  # 'н'
-     238: 1,  # 'о'
-     239: 15,  # 'п'
-     240: 9,  # 'Ñ€'
-     241: 7,  # 'Ñ'
-     242: 6,  # 'Ñ‚'
-     243: 14,  # 'у'
-     244: 39,  # 'Ñ„'
-     245: 26,  # 'Ñ…'
-     246: 28,  # 'ц'
-     247: 22,  # 'ч'
-     248: 25,  # 'ш'
-     249: 29,  # 'щ'
-     250: 54,  # 'ÑŠ'
-     251: 18,  # 'Ñ‹'
-     252: 17,  # 'ь'
-     253: 30,  # 'Ñ'
-     254: 27,  # 'ÑŽ'
-     255: 255,  # '€'
-}
-
-MACCYRILLIC_RUSSIAN_MODEL = SingleByteCharSetModel(charset_name='MacCyrillic',
-                                                   language='Russian',
-                                                   char_to_order_map=MACCYRILLIC_RUSSIAN_CHAR_TO_ORDER,
-                                                   language_model=RUSSIAN_LANG_MODEL,
-                                                   typical_positive_ratio=0.976601,
-                                                   keep_ascii_letters=False,
-                                                   alphabet='ÐÐБВГДЕЖЗИЙКЛМÐОПРСТУФХЦЧШЩЪЫЬЭЮЯабвгдежзийклмнопрÑтуфхцчшщъыьÑÑŽÑÑ‘')
-
-ISO_8859_5_RUSSIAN_CHAR_TO_ORDER = {
-     0: 255,  # '\x00'
-     1: 255,  # '\x01'
-     2: 255,  # '\x02'
-     3: 255,  # '\x03'
-     4: 255,  # '\x04'
-     5: 255,  # '\x05'
-     6: 255,  # '\x06'
-     7: 255,  # '\x07'
-     8: 255,  # '\x08'
-     9: 255,  # '\t'
-     10: 254,  # '\n'
-     11: 255,  # '\x0b'
-     12: 255,  # '\x0c'
-     13: 254,  # '\r'
-     14: 255,  # '\x0e'
-     15: 255,  # '\x0f'
-     16: 255,  # '\x10'
-     17: 255,  # '\x11'
-     18: 255,  # '\x12'
-     19: 255,  # '\x13'
-     20: 255,  # '\x14'
-     21: 255,  # '\x15'
-     22: 255,  # '\x16'
-     23: 255,  # '\x17'
-     24: 255,  # '\x18'
-     25: 255,  # '\x19'
-     26: 255,  # '\x1a'
-     27: 255,  # '\x1b'
-     28: 255,  # '\x1c'
-     29: 255,  # '\x1d'
-     30: 255,  # '\x1e'
-     31: 255,  # '\x1f'
-     32: 253,  # ' '
-     33: 253,  # '!'
-     34: 253,  # '"'
-     35: 253,  # '#'
-     36: 253,  # '$'
-     37: 253,  # '%'
-     38: 253,  # '&'
-     39: 253,  # "'"
-     40: 253,  # '('
-     41: 253,  # ')'
-     42: 253,  # '*'
-     43: 253,  # '+'
-     44: 253,  # ','
-     45: 253,  # '-'
-     46: 253,  # '.'
-     47: 253,  # '/'
-     48: 252,  # '0'
-     49: 252,  # '1'
-     50: 252,  # '2'
-     51: 252,  # '3'
-     52: 252,  # '4'
-     53: 252,  # '5'
-     54: 252,  # '6'
-     55: 252,  # '7'
-     56: 252,  # '8'
-     57: 252,  # '9'
-     58: 253,  # ':'
-     59: 253,  # ';'
-     60: 253,  # '<'
-     61: 253,  # '='
-     62: 253,  # '>'
-     63: 253,  # '?'
-     64: 253,  # '@'
-     65: 142,  # 'A'
-     66: 143,  # 'B'
-     67: 144,  # 'C'
-     68: 145,  # 'D'
-     69: 146,  # 'E'
-     70: 147,  # 'F'
-     71: 148,  # 'G'
-     72: 149,  # 'H'
-     73: 150,  # 'I'
-     74: 151,  # 'J'
-     75: 152,  # 'K'
-     76: 74,  # 'L'
-     77: 153,  # 'M'
-     78: 75,  # 'N'
-     79: 154,  # 'O'
-     80: 155,  # 'P'
-     81: 156,  # 'Q'
-     82: 157,  # 'R'
-     83: 158,  # 'S'
-     84: 159,  # 'T'
-     85: 160,  # 'U'
-     86: 161,  # 'V'
-     87: 162,  # 'W'
-     88: 163,  # 'X'
-     89: 164,  # 'Y'
-     90: 165,  # 'Z'
-     91: 253,  # '['
-     92: 253,  # '\\'
-     93: 253,  # ']'
-     94: 253,  # '^'
-     95: 253,  # '_'
-     96: 253,  # '`'
-     97: 71,  # 'a'
-     98: 172,  # 'b'
-     99: 66,  # 'c'
-     100: 173,  # 'd'
-     101: 65,  # 'e'
-     102: 174,  # 'f'
-     103: 76,  # 'g'
-     104: 175,  # 'h'
-     105: 64,  # 'i'
-     106: 176,  # 'j'
-     107: 177,  # 'k'
-     108: 77,  # 'l'
-     109: 72,  # 'm'
-     110: 178,  # 'n'
-     111: 69,  # 'o'
-     112: 67,  # 'p'
-     113: 179,  # 'q'
-     114: 78,  # 'r'
-     115: 73,  # 's'
-     116: 180,  # 't'
-     117: 181,  # 'u'
-     118: 79,  # 'v'
-     119: 182,  # 'w'
-     120: 183,  # 'x'
-     121: 184,  # 'y'
-     122: 185,  # 'z'
-     123: 253,  # '{'
-     124: 253,  # '|'
-     125: 253,  # '}'
-     126: 253,  # '~'
-     127: 253,  # '\x7f'
-     128: 191,  # '\x80'
-     129: 192,  # '\x81'
-     130: 193,  # '\x82'
-     131: 194,  # '\x83'
-     132: 195,  # '\x84'
-     133: 196,  # '\x85'
-     134: 197,  # '\x86'
-     135: 198,  # '\x87'
-     136: 199,  # '\x88'
-     137: 200,  # '\x89'
-     138: 201,  # '\x8a'
-     139: 202,  # '\x8b'
-     140: 203,  # '\x8c'
-     141: 204,  # '\x8d'
-     142: 205,  # '\x8e'
-     143: 206,  # '\x8f'
-     144: 207,  # '\x90'
-     145: 208,  # '\x91'
-     146: 209,  # '\x92'
-     147: 210,  # '\x93'
-     148: 211,  # '\x94'
-     149: 212,  # '\x95'
-     150: 213,  # '\x96'
-     151: 214,  # '\x97'
-     152: 215,  # '\x98'
-     153: 216,  # '\x99'
-     154: 217,  # '\x9a'
-     155: 218,  # '\x9b'
-     156: 219,  # '\x9c'
-     157: 220,  # '\x9d'
-     158: 221,  # '\x9e'
-     159: 222,  # '\x9f'
-     160: 223,  # '\xa0'
-     161: 224,  # 'Ð'
-     162: 225,  # 'Ђ'
-     163: 226,  # 'Ѓ'
-     164: 227,  # 'Є'
-     165: 228,  # 'Ð…'
-     166: 229,  # 'І'
-     167: 230,  # 'Ї'
-     168: 231,  # 'Ј'
-     169: 232,  # 'Љ'
-     170: 233,  # 'Њ'
-     171: 234,  # 'Ћ'
-     172: 235,  # 'Ќ'
-     173: 236,  # '\xad'
-     174: 237,  # 'ÐŽ'
-     175: 238,  # 'Ð'
-     176: 37,  # 'Ð'
-     177: 44,  # 'Б'
-     178: 33,  # 'Ð’'
-     179: 46,  # 'Г'
-     180: 41,  # 'Д'
-     181: 48,  # 'Е'
-     182: 56,  # 'Ж'
-     183: 51,  # 'З'
-     184: 42,  # 'И'
-     185: 60,  # 'Й'
-     186: 36,  # 'К'
-     187: 49,  # 'Л'
-     188: 38,  # 'М'
-     189: 31,  # 'Ð'
-     190: 34,  # 'О'
-     191: 35,  # 'П'
-     192: 45,  # 'Р'
-     193: 32,  # 'С'
-     194: 40,  # 'Т'
-     195: 52,  # 'У'
-     196: 53,  # 'Ф'
-     197: 55,  # 'Ð¥'
-     198: 58,  # 'Ц'
-     199: 50,  # 'Ч'
-     200: 57,  # 'Ш'
-     201: 63,  # 'Щ'
-     202: 70,  # 'Ъ'
-     203: 62,  # 'Ы'
-     204: 61,  # 'Ь'
-     205: 47,  # 'Э'
-     206: 59,  # 'Ю'
-     207: 43,  # 'Я'
-     208: 3,  # 'а'
-     209: 21,  # 'б'
-     210: 10,  # 'в'
-     211: 19,  # 'г'
-     212: 13,  # 'д'
-     213: 2,  # 'е'
-     214: 24,  # 'ж'
-     215: 20,  # 'з'
-     216: 4,  # 'и'
-     217: 23,  # 'й'
-     218: 11,  # 'к'
-     219: 8,  # 'л'
-     220: 12,  # 'м'
-     221: 5,  # 'н'
-     222: 1,  # 'о'
-     223: 15,  # 'п'
-     224: 9,  # 'Ñ€'
-     225: 7,  # 'Ñ'
-     226: 6,  # 'Ñ‚'
-     227: 14,  # 'у'
-     228: 39,  # 'Ñ„'
-     229: 26,  # 'Ñ…'
-     230: 28,  # 'ц'
-     231: 22,  # 'ч'
-     232: 25,  # 'ш'
-     233: 29,  # 'щ'
-     234: 54,  # 'ÑŠ'
-     235: 18,  # 'Ñ‹'
-     236: 17,  # 'ь'
-     237: 30,  # 'Ñ'
-     238: 27,  # 'ÑŽ'
-     239: 16,  # 'Ñ'
-     240: 239,  # 'â„–'
-     241: 68,  # 'Ñ‘'
-     242: 240,  # 'Ñ’'
-     243: 241,  # 'Ñ“'
-     244: 242,  # 'Ñ”'
-     245: 243,  # 'Ñ•'
-     246: 244,  # 'Ñ–'
-     247: 245,  # 'Ñ—'
-     248: 246,  # 'ј'
-     249: 247,  # 'Ñ™'
-     250: 248,  # 'Ñš'
-     251: 249,  # 'Ñ›'
-     252: 250,  # 'ќ'
-     253: 251,  # '§'
-     254: 252,  # 'Ñž'
-     255: 255,  # 'ÑŸ'
-}
-
-ISO_8859_5_RUSSIAN_MODEL = SingleByteCharSetModel(charset_name='ISO-8859-5',
-                                                  language='Russian',
-                                                  char_to_order_map=ISO_8859_5_RUSSIAN_CHAR_TO_ORDER,
-                                                  language_model=RUSSIAN_LANG_MODEL,
-                                                  typical_positive_ratio=0.976601,
-                                                  keep_ascii_letters=False,
-                                                  alphabet='ÐÐБВГДЕЖЗИЙКЛМÐОПРСТУФХЦЧШЩЪЫЬЭЮЯабвгдежзийклмнопрÑтуфхцчшщъыьÑÑŽÑÑ‘')
-
diff --git a/lib/sub_repos/chardet/chardet/langthaimodel.py b/lib/sub_repos/chardet/chardet/langthaimodel.py
deleted file mode 100644
index d0191f241..000000000
--- a/lib/sub_repos/chardet/chardet/langthaimodel.py
+++ /dev/null
@@ -1,4383 +0,0 @@
-#!/usr/bin/env python
-# -*- coding: utf-8 -*-
-
-from chardet.sbcharsetprober import SingleByteCharSetModel
-
-
-# 3: Positive
-# 2: Likely
-# 1: Unlikely
-# 0: Negative
-
-THAI_LANG_MODEL = {
-    5: {  # 'à¸'
-        5: 2,  # 'à¸'
-        30: 2,  # 'ข'
-        24: 2,  # 'ค'
-        8: 2,  # 'ง'
-        26: 2,  # 'จ'
-        52: 0,  # 'ฉ'
-        34: 1,  # 'ช'
-        51: 1,  # 'ซ'
-        47: 0,  # 'à¸'
-        58: 3,  # 'ฎ'
-        57: 2,  # 'à¸'
-        49: 0,  # 'à¸'
-        53: 0,  # 'ฑ'
-        55: 0,  # 'ฒ'
-        43: 2,  # 'ณ'
-        20: 2,  # 'ด'
-        19: 3,  # 'ต'
-        44: 0,  # 'ถ'
-        14: 2,  # 'ท'
-        48: 0,  # 'ธ'
-        3: 2,  # 'น'
-        17: 1,  # 'บ'
-        25: 2,  # 'ป'
-        39: 1,  # 'ผ'
-        62: 1,  # 'à¸'
-        31: 1,  # 'พ'
-        54: 0,  # 'ฟ'
-        45: 1,  # 'ภ'
-        9: 2,  # 'ม'
-        16: 1,  # 'ย'
-        2: 3,  # 'ร'
-        61: 2,  # 'ฤ'
-        15: 3,  # 'ล'
-        12: 3,  # 'ว'
-        42: 2,  # 'ศ'
-        46: 3,  # 'ษ'
-        18: 2,  # 'ส'
-        21: 2,  # 'ห'
-        4: 3,  # 'อ'
-        63: 1,  # 'ฯ'
-        22: 2,  # 'ะ'
-        10: 3,  # 'ั'
-        1: 3,  # 'า'
-        36: 3,  # 'ำ'
-        23: 3,  # 'ิ'
-        13: 3,  # 'ี'
-        40: 0,  # 'ึ'
-        27: 2,  # 'ื'
-        32: 2,  # 'ุ'
-        35: 1,  # 'ู'
-        11: 2,  # 'เ'
-        28: 2,  # 'à¹'
-        41: 1,  # 'โ'
-        29: 1,  # 'ใ'
-        33: 2,  # 'ไ'
-        50: 1,  # 'ๆ'
-        37: 3,  # '็'
-        6: 3,  # '่'
-        7: 3,  # '้'
-        38: 2,  # '์'
-        56: 0,  # '๑'
-        59: 0,  # '๒'
-        60: 0,  # '๕'
-    },
-    30: {  # 'ข'
-        5: 1,  # 'à¸'
-        30: 0,  # 'ข'
-        24: 1,  # 'ค'
-        8: 1,  # 'ง'
-        26: 1,  # 'จ'
-        52: 0,  # 'ฉ'
-        34: 0,  # 'ช'
-        51: 0,  # 'ซ'
-        47: 0,  # 'à¸'
-        58: 0,  # 'ฎ'
-        57: 0,  # 'à¸'
-        49: 0,  # 'à¸'
-        53: 0,  # 'ฑ'
-        55: 0,  # 'ฒ'
-        43: 2,  # 'ณ'
-        20: 0,  # 'ด'
-        19: 2,  # 'ต'
-        44: 0,  # 'ถ'
-        14: 1,  # 'ท'
-        48: 0,  # 'ธ'
-        3: 2,  # 'น'
-        17: 1,  # 'บ'
-        25: 1,  # 'ป'
-        39: 0,  # 'ผ'
-        62: 0,  # 'à¸'
-        31: 0,  # 'พ'
-        54: 0,  # 'ฟ'
-        45: 0,  # 'ภ'
-        9: 0,  # 'ม'
-        16: 2,  # 'ย'
-        2: 1,  # 'ร'
-        61: 0,  # 'ฤ'
-        15: 0,  # 'ล'
-        12: 2,  # 'ว'
-        42: 0,  # 'ศ'
-        46: 0,  # 'ษ'
-        18: 1,  # 'ส'
-        21: 1,  # 'ห'
-        4: 3,  # 'อ'
-        63: 0,  # 'ฯ'
-        22: 0,  # 'ะ'
-        10: 3,  # 'ั'
-        1: 3,  # 'า'
-        36: 0,  # 'ำ'
-        23: 0,  # 'ิ'
-        13: 2,  # 'ี'
-        40: 3,  # 'ึ'
-        27: 1,  # 'ื'
-        32: 1,  # 'ุ'
-        35: 0,  # 'ู'
-        11: 0,  # 'เ'
-        28: 0,  # 'à¹'
-        41: 0,  # 'โ'
-        29: 1,  # 'ใ'
-        33: 0,  # 'ไ'
-        50: 0,  # 'ๆ'
-        37: 1,  # '็'
-        6: 2,  # '่'
-        7: 3,  # '้'
-        38: 1,  # '์'
-        56: 0,  # '๑'
-        59: 0,  # '๒'
-        60: 0,  # '๕'
-    },
-    24: {  # 'ค'
-        5: 0,  # 'à¸'
-        30: 0,  # 'ข'
-        24: 2,  # 'ค'
-        8: 2,  # 'ง'
-        26: 0,  # 'จ'
-        52: 0,  # 'ฉ'
-        34: 0,  # 'ช'
-        51: 0,  # 'ซ'
-        47: 0,  # 'à¸'
-        58: 0,  # 'ฎ'
-        57: 0,  # 'à¸'
-        49: 0,  # 'à¸'
-        53: 0,  # 'ฑ'
-        55: 0,  # 'ฒ'
-        43: 2,  # 'ณ'
-        20: 2,  # 'ด'
-        19: 2,  # 'ต'
-        44: 0,  # 'ถ'
-        14: 1,  # 'ท'
-        48: 0,  # 'ธ'
-        3: 3,  # 'น'
-        17: 0,  # 'บ'
-        25: 1,  # 'ป'
-        39: 0,  # 'ผ'
-        62: 0,  # 'à¸'
-        31: 0,  # 'พ'
-        54: 0,  # 'ฟ'
-        45: 0,  # 'ภ'
-        9: 2,  # 'ม'
-        16: 2,  # 'ย'
-        2: 3,  # 'ร'
-        61: 0,  # 'ฤ'
-        15: 3,  # 'ล'
-        12: 3,  # 'ว'
-        42: 0,  # 'ศ'
-        46: 0,  # 'ษ'
-        18: 1,  # 'ส'
-        21: 0,  # 'ห'
-        4: 2,  # 'อ'
-        63: 0,  # 'ฯ'
-        22: 2,  # 'ะ'
-        10: 3,  # 'ั'
-        1: 2,  # 'า'
-        36: 3,  # 'ำ'
-        23: 3,  # 'ิ'
-        13: 2,  # 'ี'
-        40: 0,  # 'ึ'
-        27: 3,  # 'ื'
-        32: 3,  # 'ุ'
-        35: 2,  # 'ู'
-        11: 1,  # 'เ'
-        28: 0,  # 'à¹'
-        41: 3,  # 'โ'
-        29: 0,  # 'ใ'
-        33: 0,  # 'ไ'
-        50: 0,  # 'ๆ'
-        37: 1,  # '็'
-        6: 3,  # '่'
-        7: 3,  # '้'
-        38: 3,  # '์'
-        56: 0,  # '๑'
-        59: 0,  # '๒'
-        60: 0,  # '๕'
-    },
-    8: {  # 'ง'
-        5: 3,  # 'à¸'
-        30: 2,  # 'ข'
-        24: 3,  # 'ค'
-        8: 2,  # 'ง'
-        26: 2,  # 'จ'
-        52: 1,  # 'ฉ'
-        34: 2,  # 'ช'
-        51: 1,  # 'ซ'
-        47: 0,  # 'à¸'
-        58: 0,  # 'ฎ'
-        57: 0,  # 'à¸'
-        49: 0,  # 'à¸'
-        53: 0,  # 'ฑ'
-        55: 0,  # 'ฒ'
-        43: 0,  # 'ณ'
-        20: 2,  # 'ด'
-        19: 2,  # 'ต'
-        44: 1,  # 'ถ'
-        14: 3,  # 'ท'
-        48: 1,  # 'ธ'
-        3: 3,  # 'น'
-        17: 2,  # 'บ'
-        25: 2,  # 'ป'
-        39: 2,  # 'ผ'
-        62: 1,  # 'à¸'
-        31: 2,  # 'พ'
-        54: 0,  # 'ฟ'
-        45: 1,  # 'ภ'
-        9: 2,  # 'ม'
-        16: 1,  # 'ย'
-        2: 2,  # 'ร'
-        61: 0,  # 'ฤ'
-        15: 2,  # 'ล'
-        12: 2,  # 'ว'
-        42: 2,  # 'ศ'
-        46: 1,  # 'ษ'
-        18: 3,  # 'ส'
-        21: 3,  # 'ห'
-        4: 2,  # 'อ'
-        63: 0,  # 'ฯ'
-        22: 0,  # 'ะ'
-        10: 1,  # 'ั'
-        1: 3,  # 'า'
-        36: 0,  # 'ำ'
-        23: 2,  # 'ิ'
-        13: 1,  # 'ี'
-        40: 0,  # 'ึ'
-        27: 1,  # 'ื'
-        32: 1,  # 'ุ'
-        35: 0,  # 'ู'
-        11: 3,  # 'เ'
-        28: 2,  # 'à¹'
-        41: 1,  # 'โ'
-        29: 2,  # 'ใ'
-        33: 2,  # 'ไ'
-        50: 3,  # 'ๆ'
-        37: 0,  # '็'
-        6: 2,  # '่'
-        7: 0,  # '้'
-        38: 0,  # '์'
-        56: 0,  # '๑'
-        59: 0,  # '๒'
-        60: 0,  # '๕'
-    },
-    26: {  # 'จ'
-        5: 2,  # 'à¸'
-        30: 1,  # 'ข'
-        24: 0,  # 'ค'
-        8: 2,  # 'ง'
-        26: 3,  # 'จ'
-        52: 0,  # 'ฉ'
-        34: 0,  # 'ช'
-        51: 0,  # 'ซ'
-        47: 0,  # 'à¸'
-        58: 0,  # 'ฎ'
-        57: 0,  # 'à¸'
-        49: 0,  # 'à¸'
-        53: 0,  # 'ฑ'
-        55: 0,  # 'ฒ'
-        43: 0,  # 'ณ'
-        20: 2,  # 'ด'
-        19: 1,  # 'ต'
-        44: 1,  # 'ถ'
-        14: 2,  # 'ท'
-        48: 0,  # 'ธ'
-        3: 3,  # 'น'
-        17: 1,  # 'บ'
-        25: 0,  # 'ป'
-        39: 0,  # 'ผ'
-        62: 0,  # 'à¸'
-        31: 1,  # 'พ'
-        54: 0,  # 'ฟ'
-        45: 0,  # 'ภ'
-        9: 1,  # 'ม'
-        16: 1,  # 'ย'
-        2: 3,  # 'ร'
-        61: 0,  # 'ฤ'
-        15: 0,  # 'ล'
-        12: 1,  # 'ว'
-        42: 0,  # 'ศ'
-        46: 0,  # 'ษ'
-        18: 2,  # 'ส'
-        21: 1,  # 'ห'
-        4: 2,  # 'อ'
-        63: 0,  # 'ฯ'
-        22: 3,  # 'ะ'
-        10: 3,  # 'ั'
-        1: 3,  # 'า'
-        36: 3,  # 'ำ'
-        23: 2,  # 'ิ'
-        13: 1,  # 'ี'
-        40: 3,  # 'ึ'
-        27: 1,  # 'ื'
-        32: 3,  # 'ุ'
-        35: 2,  # 'ู'
-        11: 1,  # 'เ'
-        28: 1,  # 'à¹'
-        41: 0,  # 'โ'
-        29: 1,  # 'ใ'
-        33: 1,  # 'ไ'
-        50: 0,  # 'ๆ'
-        37: 0,  # '็'
-        6: 2,  # '่'
-        7: 2,  # '้'
-        38: 0,  # '์'
-        56: 0,  # '๑'
-        59: 0,  # '๒'
-        60: 0,  # '๕'
-    },
-    52: {  # 'ฉ'
-        5: 0,  # 'à¸'
-        30: 0,  # 'ข'
-        24: 0,  # 'ค'
-        8: 0,  # 'ง'
-        26: 0,  # 'จ'
-        52: 0,  # 'ฉ'
-        34: 0,  # 'ช'
-        51: 0,  # 'ซ'
-        47: 0,  # 'à¸'
-        58: 0,  # 'ฎ'
-        57: 0,  # 'à¸'
-        49: 0,  # 'à¸'
-        53: 0,  # 'ฑ'
-        55: 0,  # 'ฒ'
-        43: 0,  # 'ณ'
-        20: 0,  # 'ด'
-        19: 0,  # 'ต'
-        44: 0,  # 'ถ'
-        14: 0,  # 'ท'
-        48: 0,  # 'ธ'
-        3: 0,  # 'น'
-        17: 3,  # 'บ'
-        25: 0,  # 'ป'
-        39: 0,  # 'ผ'
-        62: 0,  # 'à¸'
-        31: 3,  # 'พ'
-        54: 0,  # 'ฟ'
-        45: 0,  # 'ภ'
-        9: 1,  # 'ม'
-        16: 1,  # 'ย'
-        2: 0,  # 'ร'
-        61: 0,  # 'ฤ'
-        15: 2,  # 'ล'
-        12: 1,  # 'ว'
-        42: 0,  # 'ศ'
-        46: 0,  # 'ษ'
-        18: 0,  # 'ส'
-        21: 0,  # 'ห'
-        4: 0,  # 'อ'
-        63: 0,  # 'ฯ'
-        22: 1,  # 'ะ'
-        10: 1,  # 'ั'
-        1: 1,  # 'า'
-        36: 0,  # 'ำ'
-        23: 1,  # 'ิ'
-        13: 1,  # 'ี'
-        40: 0,  # 'ึ'
-        27: 0,  # 'ื'
-        32: 1,  # 'ุ'
-        35: 0,  # 'ู'
-        11: 0,  # 'เ'
-        28: 0,  # 'à¹'
-        41: 0,  # 'โ'
-        29: 0,  # 'ใ'
-        33: 0,  # 'ไ'
-        50: 0,  # 'ๆ'
-        37: 0,  # '็'
-        6: 0,  # '่'
-        7: 0,  # '้'
-        38: 0,  # '์'
-        56: 0,  # '๑'
-        59: 0,  # '๒'
-        60: 0,  # '๕'
-    },
-    34: {  # 'ช'
-        5: 1,  # 'à¸'
-        30: 0,  # 'ข'
-        24: 0,  # 'ค'
-        8: 1,  # 'ง'
-        26: 0,  # 'จ'
-        52: 0,  # 'ฉ'
-        34: 0,  # 'ช'
-        51: 0,  # 'ซ'
-        47: 1,  # 'à¸'
-        58: 0,  # 'ฎ'
-        57: 0,  # 'à¸'
-        49: 0,  # 'à¸'
-        53: 0,  # 'ฑ'
-        55: 0,  # 'ฒ'
-        43: 0,  # 'ณ'
-        20: 0,  # 'ด'
-        19: 0,  # 'ต'
-        44: 0,  # 'ถ'
-        14: 1,  # 'ท'
-        48: 0,  # 'ธ'
-        3: 3,  # 'น'
-        17: 2,  # 'บ'
-        25: 0,  # 'ป'
-        39: 0,  # 'ผ'
-        62: 0,  # 'à¸'
-        31: 0,  # 'พ'
-        54: 0,  # 'ฟ'
-        45: 0,  # 'ภ'
-        9: 2,  # 'ม'
-        16: 1,  # 'ย'
-        2: 1,  # 'ร'
-        61: 0,  # 'ฤ'
-        15: 0,  # 'ล'
-        12: 1,  # 'ว'
-        42: 0,  # 'ศ'
-        46: 0,  # 'ษ'
-        18: 0,  # 'ส'
-        21: 0,  # 'ห'
-        4: 2,  # 'อ'
-        63: 0,  # 'ฯ'
-        22: 0,  # 'ะ'
-        10: 2,  # 'ั'
-        1: 3,  # 'า'
-        36: 1,  # 'ำ'
-        23: 3,  # 'ิ'
-        13: 2,  # 'ี'
-        40: 0,  # 'ึ'
-        27: 3,  # 'ื'
-        32: 3,  # 'ุ'
-        35: 1,  # 'ู'
-        11: 0,  # 'เ'
-        28: 0,  # 'à¹'
-        41: 0,  # 'โ'
-        29: 0,  # 'ใ'
-        33: 0,  # 'ไ'
-        50: 0,  # 'ๆ'
-        37: 1,  # '็'
-        6: 3,  # '่'
-        7: 3,  # '้'
-        38: 0,  # '์'
-        56: 0,  # '๑'
-        59: 0,  # '๒'
-        60: 0,  # '๕'
-    },
-    51: {  # 'ซ'
-        5: 0,  # 'à¸'
-        30: 0,  # 'ข'
-        24: 0,  # 'ค'
-        8: 0,  # 'ง'
-        26: 0,  # 'จ'
-        52: 0,  # 'ฉ'
-        34: 0,  # 'ช'
-        51: 0,  # 'ซ'
-        47: 0,  # 'à¸'
-        58: 0,  # 'ฎ'
-        57: 0,  # 'à¸'
-        49: 0,  # 'à¸'
-        53: 0,  # 'ฑ'
-        55: 0,  # 'ฒ'
-        43: 0,  # 'ณ'
-        20: 0,  # 'ด'
-        19: 0,  # 'ต'
-        44: 0,  # 'ถ'
-        14: 0,  # 'ท'
-        48: 0,  # 'ธ'
-        3: 1,  # 'น'
-        17: 0,  # 'บ'
-        25: 0,  # 'ป'
-        39: 0,  # 'ผ'
-        62: 0,  # 'à¸'
-        31: 0,  # 'พ'
-        54: 0,  # 'ฟ'
-        45: 0,  # 'ภ'
-        9: 0,  # 'ม'
-        16: 0,  # 'ย'
-        2: 0,  # 'ร'
-        61: 0,  # 'ฤ'
-        15: 1,  # 'ล'
-        12: 0,  # 'ว'
-        42: 0,  # 'ศ'
-        46: 0,  # 'ษ'
-        18: 1,  # 'ส'
-        21: 0,  # 'ห'
-        4: 2,  # 'อ'
-        63: 0,  # 'ฯ'
-        22: 0,  # 'ะ'
-        10: 1,  # 'ั'
-        1: 1,  # 'า'
-        36: 0,  # 'ำ'
-        23: 1,  # 'ิ'
-        13: 2,  # 'ี'
-        40: 3,  # 'ึ'
-        27: 2,  # 'ื'
-        32: 1,  # 'ุ'
-        35: 1,  # 'ู'
-        11: 1,  # 'เ'
-        28: 0,  # 'à¹'
-        41: 0,  # 'โ'
-        29: 0,  # 'ใ'
-        33: 0,  # 'ไ'
-        50: 0,  # 'ๆ'
-        37: 1,  # '็'
-        6: 1,  # '่'
-        7: 2,  # '้'
-        38: 1,  # '์'
-        56: 0,  # '๑'
-        59: 0,  # '๒'
-        60: 0,  # '๕'
-    },
-    47: {  # 'à¸'
-        5: 1,  # 'à¸'
-        30: 1,  # 'ข'
-        24: 0,  # 'ค'
-        8: 0,  # 'ง'
-        26: 0,  # 'จ'
-        52: 0,  # 'ฉ'
-        34: 1,  # 'ช'
-        51: 0,  # 'ซ'
-        47: 3,  # 'à¸'
-        58: 0,  # 'ฎ'
-        57: 0,  # 'à¸'
-        49: 0,  # 'à¸'
-        53: 0,  # 'ฑ'
-        55: 0,  # 'ฒ'
-        43: 0,  # 'ณ'
-        20: 0,  # 'ด'
-        19: 0,  # 'ต'
-        44: 0,  # 'ถ'
-        14: 1,  # 'ท'
-        48: 0,  # 'ธ'
-        3: 0,  # 'น'
-        17: 1,  # 'บ'
-        25: 1,  # 'ป'
-        39: 0,  # 'ผ'
-        62: 0,  # 'à¸'
-        31: 0,  # 'พ'
-        54: 0,  # 'ฟ'
-        45: 0,  # 'ภ'
-        9: 1,  # 'ม'
-        16: 0,  # 'ย'
-        2: 0,  # 'ร'
-        61: 0,  # 'ฤ'
-        15: 1,  # 'ล'
-        12: 0,  # 'ว'
-        42: 0,  # 'ศ'
-        46: 0,  # 'ษ'
-        18: 1,  # 'ส'
-        21: 2,  # 'ห'
-        4: 1,  # 'อ'
-        63: 0,  # 'ฯ'
-        22: 1,  # 'ะ'
-        10: 2,  # 'ั'
-        1: 3,  # 'า'
-        36: 0,  # 'ำ'
-        23: 1,  # 'ิ'
-        13: 1,  # 'ี'
-        40: 0,  # 'ึ'
-        27: 0,  # 'ื'
-        32: 0,  # 'ุ'
-        35: 0,  # 'ู'
-        11: 1,  # 'เ'
-        28: 1,  # 'à¹'
-        41: 0,  # 'โ'
-        29: 1,  # 'ใ'
-        33: 0,  # 'ไ'
-        50: 1,  # 'ๆ'
-        37: 0,  # '็'
-        6: 2,  # '่'
-        7: 0,  # '้'
-        38: 0,  # '์'
-        56: 0,  # '๑'
-        59: 0,  # '๒'
-        60: 0,  # '๕'
-    },
-    58: {  # 'ฎ'
-        5: 2,  # 'à¸'
-        30: 0,  # 'ข'
-        24: 0,  # 'ค'
-        8: 0,  # 'ง'
-        26: 0,  # 'จ'
-        52: 0,  # 'ฉ'
-        34: 0,  # 'ช'
-        51: 0,  # 'ซ'
-        47: 0,  # 'à¸'
-        58: 0,  # 'ฎ'
-        57: 0,  # 'à¸'
-        49: 0,  # 'à¸'
-        53: 0,  # 'ฑ'
-        55: 0,  # 'ฒ'
-        43: 0,  # 'ณ'
-        20: 0,  # 'ด'
-        19: 0,  # 'ต'
-        44: 0,  # 'ถ'
-        14: 0,  # 'ท'
-        48: 0,  # 'ธ'
-        3: 0,  # 'น'
-        17: 0,  # 'บ'
-        25: 0,  # 'ป'
-        39: 0,  # 'ผ'
-        62: 0,  # 'à¸'
-        31: 0,  # 'พ'
-        54: 0,  # 'ฟ'
-        45: 0,  # 'ภ'
-        9: 0,  # 'ม'
-        16: 0,  # 'ย'
-        2: 0,  # 'ร'
-        61: 0,  # 'ฤ'
-        15: 0,  # 'ล'
-        12: 0,  # 'ว'
-        42: 0,  # 'ศ'
-        46: 0,  # 'ษ'
-        18: 0,  # 'ส'
-        21: 1,  # 'ห'
-        4: 0,  # 'อ'
-        63: 0,  # 'ฯ'
-        22: 0,  # 'ะ'
-        10: 0,  # 'ั'
-        1: 0,  # 'า'
-        36: 0,  # 'ำ'
-        23: 1,  # 'ิ'
-        13: 2,  # 'ี'
-        40: 0,  # 'ึ'
-        27: 0,  # 'ื'
-        32: 0,  # 'ุ'
-        35: 0,  # 'ู'
-        11: 0,  # 'เ'
-        28: 0,  # 'à¹'
-        41: 0,  # 'โ'
-        29: 0,  # 'ใ'
-        33: 0,  # 'ไ'
-        50: 0,  # 'ๆ'
-        37: 0,  # '็'
-        6: 0,  # '่'
-        7: 0,  # '้'
-        38: 0,  # '์'
-        56: 0,  # '๑'
-        59: 0,  # '๒'
-        60: 0,  # '๕'
-    },
-    57: {  # 'à¸'
-        5: 0,  # 'à¸'
-        30: 0,  # 'ข'
-        24: 0,  # 'ค'
-        8: 0,  # 'ง'
-        26: 0,  # 'จ'
-        52: 0,  # 'ฉ'
-        34: 0,  # 'ช'
-        51: 0,  # 'ซ'
-        47: 0,  # 'à¸'
-        58: 0,  # 'ฎ'
-        57: 0,  # 'à¸'
-        49: 0,  # 'à¸'
-        53: 0,  # 'ฑ'
-        55: 0,  # 'ฒ'
-        43: 0,  # 'ณ'
-        20: 0,  # 'ด'
-        19: 0,  # 'ต'
-        44: 0,  # 'ถ'
-        14: 0,  # 'ท'
-        48: 0,  # 'ธ'
-        3: 0,  # 'น'
-        17: 0,  # 'บ'
-        25: 0,  # 'ป'
-        39: 0,  # 'ผ'
-        62: 0,  # 'à¸'
-        31: 0,  # 'พ'
-        54: 0,  # 'ฟ'
-        45: 0,  # 'ภ'
-        9: 0,  # 'ม'
-        16: 0,  # 'ย'
-        2: 0,  # 'ร'
-        61: 0,  # 'ฤ'
-        15: 0,  # 'ล'
-        12: 0,  # 'ว'
-        42: 0,  # 'ศ'
-        46: 0,  # 'ษ'
-        18: 0,  # 'ส'
-        21: 0,  # 'ห'
-        4: 0,  # 'อ'
-        63: 0,  # 'ฯ'
-        22: 0,  # 'ะ'
-        10: 0,  # 'ั'
-        1: 0,  # 'า'
-        36: 0,  # 'ำ'
-        23: 3,  # 'ิ'
-        13: 1,  # 'ี'
-        40: 0,  # 'ึ'
-        27: 0,  # 'ื'
-        32: 0,  # 'ุ'
-        35: 0,  # 'ู'
-        11: 0,  # 'เ'
-        28: 0,  # 'à¹'
-        41: 0,  # 'โ'
-        29: 0,  # 'ใ'
-        33: 0,  # 'ไ'
-        50: 0,  # 'ๆ'
-        37: 0,  # '็'
-        6: 0,  # '่'
-        7: 0,  # '้'
-        38: 0,  # '์'
-        56: 0,  # '๑'
-        59: 0,  # '๒'
-        60: 0,  # '๕'
-    },
-    49: {  # 'à¸'
-        5: 1,  # 'à¸'
-        30: 0,  # 'ข'
-        24: 0,  # 'ค'
-        8: 0,  # 'ง'
-        26: 0,  # 'จ'
-        52: 0,  # 'ฉ'
-        34: 0,  # 'ช'
-        51: 0,  # 'ซ'
-        47: 0,  # 'à¸'
-        58: 0,  # 'ฎ'
-        57: 0,  # 'à¸'
-        49: 0,  # 'à¸'
-        53: 0,  # 'ฑ'
-        55: 0,  # 'ฒ'
-        43: 0,  # 'ณ'
-        20: 0,  # 'ด'
-        19: 0,  # 'ต'
-        44: 0,  # 'ถ'
-        14: 0,  # 'ท'
-        48: 0,  # 'ธ'
-        3: 0,  # 'น'
-        17: 2,  # 'บ'
-        25: 0,  # 'ป'
-        39: 0,  # 'ผ'
-        62: 0,  # 'à¸'
-        31: 0,  # 'พ'
-        54: 0,  # 'ฟ'
-        45: 0,  # 'ภ'
-        9: 2,  # 'ม'
-        16: 0,  # 'ย'
-        2: 0,  # 'ร'
-        61: 0,  # 'ฤ'
-        15: 0,  # 'ล'
-        12: 0,  # 'ว'
-        42: 1,  # 'ศ'
-        46: 0,  # 'ษ'
-        18: 0,  # 'ส'
-        21: 0,  # 'ห'
-        4: 1,  # 'อ'
-        63: 0,  # 'ฯ'
-        22: 0,  # 'ะ'
-        10: 0,  # 'ั'
-        1: 3,  # 'า'
-        36: 0,  # 'ำ'
-        23: 0,  # 'ิ'
-        13: 0,  # 'ี'
-        40: 0,  # 'ึ'
-        27: 0,  # 'ื'
-        32: 0,  # 'ุ'
-        35: 0,  # 'ู'
-        11: 0,  # 'เ'
-        28: 0,  # 'à¹'
-        41: 0,  # 'โ'
-        29: 0,  # 'ใ'
-        33: 0,  # 'ไ'
-        50: 0,  # 'ๆ'
-        37: 0,  # '็'
-        6: 0,  # '่'
-        7: 0,  # '้'
-        38: 1,  # '์'
-        56: 0,  # '๑'
-        59: 0,  # '๒'
-        60: 0,  # '๕'
-    },
-    53: {  # 'ฑ'
-        5: 0,  # 'à¸'
-        30: 0,  # 'ข'
-        24: 0,  # 'ค'
-        8: 0,  # 'ง'
-        26: 0,  # 'จ'
-        52: 0,  # 'ฉ'
-        34: 0,  # 'ช'
-        51: 0,  # 'ซ'
-        47: 0,  # 'à¸'
-        58: 0,  # 'ฎ'
-        57: 0,  # 'à¸'
-        49: 0,  # 'à¸'
-        53: 0,  # 'ฑ'
-        55: 0,  # 'ฒ'
-        43: 0,  # 'ณ'
-        20: 0,  # 'ด'
-        19: 0,  # 'ต'
-        44: 0,  # 'ถ'
-        14: 0,  # 'ท'
-        48: 0,  # 'ธ'
-        3: 0,  # 'น'
-        17: 0,  # 'บ'
-        25: 0,  # 'ป'
-        39: 0,  # 'ผ'
-        62: 0,  # 'à¸'
-        31: 0,  # 'พ'
-        54: 0,  # 'ฟ'
-        45: 0,  # 'ภ'
-        9: 0,  # 'ม'
-        16: 0,  # 'ย'
-        2: 0,  # 'ร'
-        61: 0,  # 'ฤ'
-        15: 0,  # 'ล'
-        12: 0,  # 'ว'
-        42: 0,  # 'ศ'
-        46: 0,  # 'ษ'
-        18: 0,  # 'ส'
-        21: 0,  # 'ห'
-        4: 0,  # 'อ'
-        63: 0,  # 'ฯ'
-        22: 0,  # 'ะ'
-        10: 0,  # 'ั'
-        1: 0,  # 'า'
-        36: 0,  # 'ำ'
-        23: 2,  # 'ิ'
-        13: 0,  # 'ี'
-        40: 0,  # 'ึ'
-        27: 0,  # 'ื'
-        32: 0,  # 'ุ'
-        35: 0,  # 'ู'
-        11: 0,  # 'เ'
-        28: 0,  # 'à¹'
-        41: 0,  # 'โ'
-        29: 0,  # 'ใ'
-        33: 0,  # 'ไ'
-        50: 0,  # 'ๆ'
-        37: 0,  # '็'
-        6: 0,  # '่'
-        7: 0,  # '้'
-        38: 3,  # '์'
-        56: 0,  # '๑'
-        59: 0,  # '๒'
-        60: 0,  # '๕'
-    },
-    55: {  # 'ฒ'
-        5: 0,  # 'à¸'
-        30: 0,  # 'ข'
-        24: 0,  # 'ค'
-        8: 0,  # 'ง'
-        26: 0,  # 'จ'
-        52: 0,  # 'ฉ'
-        34: 0,  # 'ช'
-        51: 0,  # 'ซ'
-        47: 0,  # 'à¸'
-        58: 0,  # 'ฎ'
-        57: 0,  # 'à¸'
-        49: 0,  # 'à¸'
-        53: 0,  # 'ฑ'
-        55: 0,  # 'ฒ'
-        43: 0,  # 'ณ'
-        20: 0,  # 'ด'
-        19: 0,  # 'ต'
-        44: 0,  # 'ถ'
-        14: 0,  # 'ท'
-        48: 0,  # 'ธ'
-        3: 3,  # 'น'
-        17: 0,  # 'บ'
-        25: 0,  # 'ป'
-        39: 0,  # 'ผ'
-        62: 0,  # 'à¸'
-        31: 1,  # 'พ'
-        54: 0,  # 'ฟ'
-        45: 0,  # 'ภ'
-        9: 0,  # 'ม'
-        16: 0,  # 'ย'
-        2: 0,  # 'ร'
-        61: 0,  # 'ฤ'
-        15: 0,  # 'ล'
-        12: 0,  # 'ว'
-        42: 0,  # 'ศ'
-        46: 0,  # 'ษ'
-        18: 0,  # 'ส'
-        21: 0,  # 'ห'
-        4: 0,  # 'อ'
-        63: 0,  # 'ฯ'
-        22: 0,  # 'ะ'
-        10: 0,  # 'ั'
-        1: 0,  # 'า'
-        36: 0,  # 'ำ'
-        23: 1,  # 'ิ'
-        13: 0,  # 'ี'
-        40: 0,  # 'ึ'
-        27: 0,  # 'ื'
-        32: 0,  # 'ุ'
-        35: 0,  # 'ู'
-        11: 0,  # 'เ'
-        28: 0,  # 'à¹'
-        41: 0,  # 'โ'
-        29: 0,  # 'ใ'
-        33: 0,  # 'ไ'
-        50: 0,  # 'ๆ'
-        37: 0,  # '็'
-        6: 0,  # '่'
-        7: 0,  # '้'
-        38: 0,  # '์'
-        56: 0,  # '๑'
-        59: 0,  # '๒'
-        60: 0,  # '๕'
-    },
-    43: {  # 'ณ'
-        5: 1,  # 'à¸'
-        30: 0,  # 'ข'
-        24: 0,  # 'ค'
-        8: 0,  # 'ง'
-        26: 0,  # 'จ'
-        52: 0,  # 'ฉ'
-        34: 0,  # 'ช'
-        51: 0,  # 'ซ'
-        47: 0,  # 'à¸'
-        58: 0,  # 'ฎ'
-        57: 0,  # 'à¸'
-        49: 0,  # 'à¸'
-        53: 3,  # 'ฑ'
-        55: 0,  # 'ฒ'
-        43: 0,  # 'ณ'
-        20: 0,  # 'ด'
-        19: 0,  # 'ต'
-        44: 0,  # 'ถ'
-        14: 0,  # 'ท'
-        48: 0,  # 'ธ'
-        3: 0,  # 'น'
-        17: 0,  # 'บ'
-        25: 0,  # 'ป'
-        39: 0,  # 'ผ'
-        62: 0,  # 'à¸'
-        31: 0,  # 'พ'
-        54: 0,  # 'ฟ'
-        45: 3,  # 'ภ'
-        9: 0,  # 'ม'
-        16: 0,  # 'ย'
-        2: 1,  # 'ร'
-        61: 0,  # 'ฤ'
-        15: 0,  # 'ล'
-        12: 1,  # 'ว'
-        42: 0,  # 'ศ'
-        46: 0,  # 'ษ'
-        18: 1,  # 'ส'
-        21: 1,  # 'ห'
-        4: 0,  # 'อ'
-        63: 0,  # 'ฯ'
-        22: 3,  # 'ะ'
-        10: 0,  # 'ั'
-        1: 3,  # 'า'
-        36: 0,  # 'ำ'
-        23: 1,  # 'ิ'
-        13: 2,  # 'ี'
-        40: 0,  # 'ึ'
-        27: 0,  # 'ื'
-        32: 0,  # 'ุ'
-        35: 0,  # 'ู'
-        11: 1,  # 'เ'
-        28: 1,  # 'à¹'
-        41: 0,  # 'โ'
-        29: 1,  # 'ใ'
-        33: 1,  # 'ไ'
-        50: 0,  # 'ๆ'
-        37: 0,  # '็'
-        6: 0,  # '่'
-        7: 0,  # '้'
-        38: 3,  # '์'
-        56: 0,  # '๑'
-        59: 0,  # '๒'
-        60: 0,  # '๕'
-    },
-    20: {  # 'ด'
-        5: 2,  # 'à¸'
-        30: 2,  # 'ข'
-        24: 2,  # 'ค'
-        8: 3,  # 'ง'
-        26: 2,  # 'จ'
-        52: 0,  # 'ฉ'
-        34: 1,  # 'ช'
-        51: 0,  # 'ซ'
-        47: 0,  # 'à¸'
-        58: 0,  # 'ฎ'
-        57: 0,  # 'à¸'
-        49: 0,  # 'à¸'
-        53: 0,  # 'ฑ'
-        55: 0,  # 'ฒ'
-        43: 0,  # 'ณ'
-        20: 1,  # 'ด'
-        19: 2,  # 'ต'
-        44: 1,  # 'ถ'
-        14: 2,  # 'ท'
-        48: 0,  # 'ธ'
-        3: 1,  # 'น'
-        17: 1,  # 'บ'
-        25: 1,  # 'ป'
-        39: 1,  # 'ผ'
-        62: 0,  # 'à¸'
-        31: 1,  # 'พ'
-        54: 0,  # 'ฟ'
-        45: 1,  # 'ภ'
-        9: 2,  # 'ม'
-        16: 3,  # 'ย'
-        2: 2,  # 'ร'
-        61: 0,  # 'ฤ'
-        15: 2,  # 'ล'
-        12: 2,  # 'ว'
-        42: 0,  # 'ศ'
-        46: 0,  # 'ษ'
-        18: 2,  # 'ส'
-        21: 2,  # 'ห'
-        4: 1,  # 'อ'
-        63: 0,  # 'ฯ'
-        22: 0,  # 'ะ'
-        10: 3,  # 'ั'
-        1: 2,  # 'า'
-        36: 2,  # 'ำ'
-        23: 3,  # 'ิ'
-        13: 3,  # 'ี'
-        40: 1,  # 'ึ'
-        27: 2,  # 'ื'
-        32: 3,  # 'ุ'
-        35: 2,  # 'ู'
-        11: 2,  # 'เ'
-        28: 2,  # 'à¹'
-        41: 1,  # 'โ'
-        29: 2,  # 'ใ'
-        33: 2,  # 'ไ'
-        50: 2,  # 'ๆ'
-        37: 2,  # '็'
-        6: 1,  # '่'
-        7: 3,  # '้'
-        38: 1,  # '์'
-        56: 0,  # '๑'
-        59: 0,  # '๒'
-        60: 0,  # '๕'
-    },
-    19: {  # 'ต'
-        5: 2,  # 'à¸'
-        30: 1,  # 'ข'
-        24: 1,  # 'ค'
-        8: 0,  # 'ง'
-        26: 1,  # 'จ'
-        52: 0,  # 'ฉ'
-        34: 1,  # 'ช'
-        51: 0,  # 'ซ'
-        47: 0,  # 'à¸'
-        58: 0,  # 'ฎ'
-        57: 0,  # 'à¸'
-        49: 0,  # 'à¸'
-        53: 0,  # 'ฑ'
-        55: 0,  # 'ฒ'
-        43: 0,  # 'ณ'
-        20: 1,  # 'ด'
-        19: 1,  # 'ต'
-        44: 2,  # 'ถ'
-        14: 1,  # 'ท'
-        48: 0,  # 'ธ'
-        3: 2,  # 'น'
-        17: 1,  # 'บ'
-        25: 1,  # 'ป'
-        39: 1,  # 'ผ'
-        62: 0,  # 'à¸'
-        31: 1,  # 'พ'
-        54: 0,  # 'ฟ'
-        45: 2,  # 'ภ'
-        9: 1,  # 'ม'
-        16: 1,  # 'ย'
-        2: 3,  # 'ร'
-        61: 0,  # 'ฤ'
-        15: 2,  # 'ล'
-        12: 1,  # 'ว'
-        42: 0,  # 'ศ'
-        46: 0,  # 'ษ'
-        18: 3,  # 'ส'
-        21: 0,  # 'ห'
-        4: 3,  # 'อ'
-        63: 1,  # 'ฯ'
-        22: 2,  # 'ะ'
-        10: 3,  # 'ั'
-        1: 3,  # 'า'
-        36: 2,  # 'ำ'
-        23: 3,  # 'ิ'
-        13: 2,  # 'ี'
-        40: 1,  # 'ึ'
-        27: 1,  # 'ื'
-        32: 3,  # 'ุ'
-        35: 2,  # 'ู'
-        11: 1,  # 'เ'
-        28: 1,  # 'à¹'
-        41: 1,  # 'โ'
-        29: 1,  # 'ใ'
-        33: 1,  # 'ไ'
-        50: 0,  # 'ๆ'
-        37: 2,  # '็'
-        6: 3,  # '่'
-        7: 3,  # '้'
-        38: 2,  # '์'
-        56: 0,  # '๑'
-        59: 0,  # '๒'
-        60: 0,  # '๕'
-    },
-    44: {  # 'ถ'
-        5: 1,  # 'à¸'
-        30: 0,  # 'ข'
-        24: 1,  # 'ค'
-        8: 0,  # 'ง'
-        26: 1,  # 'จ'
-        52: 0,  # 'ฉ'
-        34: 0,  # 'ช'
-        51: 0,  # 'ซ'
-        47: 0,  # 'à¸'
-        58: 0,  # 'ฎ'
-        57: 0,  # 'à¸'
-        49: 0,  # 'à¸'
-        53: 0,  # 'ฑ'
-        55: 0,  # 'ฒ'
-        43: 0,  # 'ณ'
-        20: 0,  # 'ด'
-        19: 1,  # 'ต'
-        44: 0,  # 'ถ'
-        14: 1,  # 'ท'
-        48: 0,  # 'ธ'
-        3: 1,  # 'น'
-        17: 2,  # 'บ'
-        25: 0,  # 'ป'
-        39: 0,  # 'ผ'
-        62: 0,  # 'à¸'
-        31: 1,  # 'พ'
-        54: 0,  # 'ฟ'
-        45: 0,  # 'ภ'
-        9: 0,  # 'ม'
-        16: 0,  # 'ย'
-        2: 1,  # 'ร'
-        61: 0,  # 'ฤ'
-        15: 1,  # 'ล'
-        12: 1,  # 'ว'
-        42: 0,  # 'ศ'
-        46: 0,  # 'ษ'
-        18: 1,  # 'ส'
-        21: 0,  # 'ห'
-        4: 1,  # 'อ'
-        63: 0,  # 'ฯ'
-        22: 0,  # 'ะ'
-        10: 2,  # 'ั'
-        1: 3,  # 'า'
-        36: 0,  # 'ำ'
-        23: 2,  # 'ิ'
-        13: 1,  # 'ี'
-        40: 3,  # 'ึ'
-        27: 2,  # 'ื'
-        32: 2,  # 'ุ'
-        35: 3,  # 'ู'
-        11: 1,  # 'เ'
-        28: 1,  # 'à¹'
-        41: 0,  # 'โ'
-        29: 1,  # 'ใ'
-        33: 1,  # 'ไ'
-        50: 0,  # 'ๆ'
-        37: 0,  # '็'
-        6: 2,  # '่'
-        7: 3,  # '้'
-        38: 0,  # '์'
-        56: 0,  # '๑'
-        59: 0,  # '๒'
-        60: 0,  # '๕'
-    },
-    14: {  # 'ท'
-        5: 1,  # 'à¸'
-        30: 1,  # 'ข'
-        24: 3,  # 'ค'
-        8: 1,  # 'ง'
-        26: 1,  # 'จ'
-        52: 0,  # 'ฉ'
-        34: 0,  # 'ช'
-        51: 0,  # 'ซ'
-        47: 0,  # 'à¸'
-        58: 0,  # 'ฎ'
-        57: 0,  # 'à¸'
-        49: 0,  # 'à¸'
-        53: 0,  # 'ฑ'
-        55: 0,  # 'ฒ'
-        43: 0,  # 'ณ'
-        20: 2,  # 'ด'
-        19: 1,  # 'ต'
-        44: 0,  # 'ถ'
-        14: 1,  # 'ท'
-        48: 3,  # 'ธ'
-        3: 3,  # 'น'
-        17: 2,  # 'บ'
-        25: 2,  # 'ป'
-        39: 1,  # 'ผ'
-        62: 0,  # 'à¸'
-        31: 2,  # 'พ'
-        54: 0,  # 'ฟ'
-        45: 0,  # 'ภ'
-        9: 1,  # 'ม'
-        16: 3,  # 'ย'
-        2: 3,  # 'ร'
-        61: 1,  # 'ฤ'
-        15: 1,  # 'ล'
-        12: 2,  # 'ว'
-        42: 3,  # 'ศ'
-        46: 1,  # 'ษ'
-        18: 1,  # 'ส'
-        21: 0,  # 'ห'
-        4: 2,  # 'อ'
-        63: 0,  # 'ฯ'
-        22: 2,  # 'ะ'
-        10: 3,  # 'ั'
-        1: 3,  # 'า'
-        36: 3,  # 'ำ'
-        23: 2,  # 'ิ'
-        13: 3,  # 'ี'
-        40: 2,  # 'ึ'
-        27: 1,  # 'ื'
-        32: 3,  # 'ุ'
-        35: 1,  # 'ู'
-        11: 0,  # 'เ'
-        28: 1,  # 'à¹'
-        41: 0,  # 'โ'
-        29: 1,  # 'ใ'
-        33: 0,  # 'ไ'
-        50: 0,  # 'ๆ'
-        37: 1,  # '็'
-        6: 3,  # '่'
-        7: 3,  # '้'
-        38: 2,  # '์'
-        56: 0,  # '๑'
-        59: 0,  # '๒'
-        60: 0,  # '๕'
-    },
-    48: {  # 'ธ'
-        5: 0,  # 'à¸'
-        30: 0,  # 'ข'
-        24: 0,  # 'ค'
-        8: 1,  # 'ง'
-        26: 0,  # 'จ'
-        52: 0,  # 'ฉ'
-        34: 0,  # 'ช'
-        51: 0,  # 'ซ'
-        47: 0,  # 'à¸'
-        58: 0,  # 'ฎ'
-        57: 0,  # 'à¸'
-        49: 0,  # 'à¸'
-        53: 0,  # 'ฑ'
-        55: 0,  # 'ฒ'
-        43: 0,  # 'ณ'
-        20: 0,  # 'ด'
-        19: 0,  # 'ต'
-        44: 0,  # 'ถ'
-        14: 0,  # 'ท'
-        48: 0,  # 'ธ'
-        3: 1,  # 'น'
-        17: 0,  # 'บ'
-        25: 0,  # 'ป'
-        39: 0,  # 'ผ'
-        62: 0,  # 'à¸'
-        31: 0,  # 'พ'
-        54: 0,  # 'ฟ'
-        45: 0,  # 'ภ'
-        9: 0,  # 'ม'
-        16: 0,  # 'ย'
-        2: 2,  # 'ร'
-        61: 0,  # 'ฤ'
-        15: 0,  # 'ล'
-        12: 0,  # 'ว'
-        42: 0,  # 'ศ'
-        46: 0,  # 'ษ'
-        18: 0,  # 'ส'
-        21: 0,  # 'ห'
-        4: 0,  # 'อ'
-        63: 0,  # 'ฯ'
-        22: 0,  # 'ะ'
-        10: 0,  # 'ั'
-        1: 2,  # 'า'
-        36: 0,  # 'ำ'
-        23: 3,  # 'ิ'
-        13: 3,  # 'ี'
-        40: 0,  # 'ึ'
-        27: 0,  # 'ื'
-        32: 2,  # 'ุ'
-        35: 0,  # 'ู'
-        11: 0,  # 'เ'
-        28: 0,  # 'à¹'
-        41: 0,  # 'โ'
-        29: 0,  # 'ใ'
-        33: 0,  # 'ไ'
-        50: 0,  # 'ๆ'
-        37: 0,  # '็'
-        6: 0,  # '่'
-        7: 0,  # '้'
-        38: 3,  # '์'
-        56: 0,  # '๑'
-        59: 0,  # '๒'
-        60: 0,  # '๕'
-    },
-    3: {  # 'น'
-        5: 3,  # 'à¸'
-        30: 2,  # 'ข'
-        24: 3,  # 'ค'
-        8: 1,  # 'ง'
-        26: 2,  # 'จ'
-        52: 0,  # 'ฉ'
-        34: 1,  # 'ช'
-        51: 1,  # 'ซ'
-        47: 0,  # 'à¸'
-        58: 0,  # 'ฎ'
-        57: 0,  # 'à¸'
-        49: 1,  # 'à¸'
-        53: 0,  # 'ฑ'
-        55: 0,  # 'ฒ'
-        43: 0,  # 'ณ'
-        20: 3,  # 'ด'
-        19: 3,  # 'ต'
-        44: 2,  # 'ถ'
-        14: 3,  # 'ท'
-        48: 3,  # 'ธ'
-        3: 2,  # 'น'
-        17: 2,  # 'บ'
-        25: 2,  # 'ป'
-        39: 2,  # 'ผ'
-        62: 0,  # 'à¸'
-        31: 2,  # 'พ'
-        54: 1,  # 'ฟ'
-        45: 1,  # 'ภ'
-        9: 2,  # 'ม'
-        16: 2,  # 'ย'
-        2: 2,  # 'ร'
-        61: 1,  # 'ฤ'
-        15: 2,  # 'ล'
-        12: 3,  # 'ว'
-        42: 1,  # 'ศ'
-        46: 0,  # 'ษ'
-        18: 2,  # 'ส'
-        21: 2,  # 'ห'
-        4: 3,  # 'อ'
-        63: 1,  # 'ฯ'
-        22: 2,  # 'ะ'
-        10: 3,  # 'ั'
-        1: 3,  # 'า'
-        36: 3,  # 'ำ'
-        23: 3,  # 'ิ'
-        13: 3,  # 'ี'
-        40: 3,  # 'ึ'
-        27: 3,  # 'ื'
-        32: 3,  # 'ุ'
-        35: 2,  # 'ู'
-        11: 3,  # 'เ'
-        28: 2,  # 'à¹'
-        41: 3,  # 'โ'
-        29: 3,  # 'ใ'
-        33: 3,  # 'ไ'
-        50: 2,  # 'ๆ'
-        37: 1,  # '็'
-        6: 3,  # '่'
-        7: 3,  # '้'
-        38: 2,  # '์'
-        56: 0,  # '๑'
-        59: 0,  # '๒'
-        60: 0,  # '๕'
-    },
-    17: {  # 'บ'
-        5: 3,  # 'à¸'
-        30: 2,  # 'ข'
-        24: 2,  # 'ค'
-        8: 1,  # 'ง'
-        26: 1,  # 'จ'
-        52: 1,  # 'ฉ'
-        34: 1,  # 'ช'
-        51: 1,  # 'ซ'
-        47: 0,  # 'à¸'
-        58: 0,  # 'ฎ'
-        57: 0,  # 'à¸'
-        49: 0,  # 'à¸'
-        53: 0,  # 'ฑ'
-        55: 0,  # 'ฒ'
-        43: 0,  # 'ณ'
-        20: 1,  # 'ด'
-        19: 2,  # 'ต'
-        44: 1,  # 'ถ'
-        14: 3,  # 'ท'
-        48: 0,  # 'ธ'
-        3: 3,  # 'น'
-        17: 3,  # 'บ'
-        25: 2,  # 'ป'
-        39: 2,  # 'ผ'
-        62: 0,  # 'à¸'
-        31: 1,  # 'พ'
-        54: 1,  # 'ฟ'
-        45: 1,  # 'ภ'
-        9: 1,  # 'ม'
-        16: 0,  # 'ย'
-        2: 3,  # 'ร'
-        61: 0,  # 'ฤ'
-        15: 2,  # 'ล'
-        12: 3,  # 'ว'
-        42: 0,  # 'ศ'
-        46: 0,  # 'ษ'
-        18: 2,  # 'ส'
-        21: 2,  # 'ห'
-        4: 2,  # 'อ'
-        63: 1,  # 'ฯ'
-        22: 0,  # 'ะ'
-        10: 3,  # 'ั'
-        1: 3,  # 'า'
-        36: 2,  # 'ำ'
-        23: 2,  # 'ิ'
-        13: 2,  # 'ี'
-        40: 0,  # 'ึ'
-        27: 2,  # 'ื'
-        32: 3,  # 'ุ'
-        35: 2,  # 'ู'
-        11: 2,  # 'เ'
-        28: 2,  # 'à¹'
-        41: 1,  # 'โ'
-        29: 2,  # 'ใ'
-        33: 2,  # 'ไ'
-        50: 0,  # 'ๆ'
-        37: 1,  # '็'
-        6: 2,  # '่'
-        7: 2,  # '้'
-        38: 0,  # '์'
-        56: 0,  # '๑'
-        59: 0,  # '๒'
-        60: 0,  # '๕'
-    },
-    25: {  # 'ป'
-        5: 2,  # 'à¸'
-        30: 0,  # 'ข'
-        24: 1,  # 'ค'
-        8: 0,  # 'ง'
-        26: 1,  # 'จ'
-        52: 0,  # 'ฉ'
-        34: 0,  # 'ช'
-        51: 1,  # 'ซ'
-        47: 0,  # 'à¸'
-        58: 1,  # 'ฎ'
-        57: 3,  # 'à¸'
-        49: 1,  # 'à¸'
-        53: 0,  # 'ฑ'
-        55: 0,  # 'ฒ'
-        43: 0,  # 'ณ'
-        20: 1,  # 'ด'
-        19: 1,  # 'ต'
-        44: 1,  # 'ถ'
-        14: 1,  # 'ท'
-        48: 0,  # 'ธ'
-        3: 2,  # 'น'
-        17: 0,  # 'บ'
-        25: 1,  # 'ป'
-        39: 1,  # 'ผ'
-        62: 1,  # 'à¸'
-        31: 1,  # 'พ'
-        54: 0,  # 'ฟ'
-        45: 0,  # 'ภ'
-        9: 1,  # 'ม'
-        16: 0,  # 'ย'
-        2: 3,  # 'ร'
-        61: 0,  # 'ฤ'
-        15: 3,  # 'ล'
-        12: 1,  # 'ว'
-        42: 0,  # 'ศ'
-        46: 1,  # 'ษ'
-        18: 2,  # 'ส'
-        21: 1,  # 'ห'
-        4: 2,  # 'อ'
-        63: 0,  # 'ฯ'
-        22: 1,  # 'ะ'
-        10: 3,  # 'ั'
-        1: 1,  # 'า'
-        36: 0,  # 'ำ'
-        23: 2,  # 'ิ'
-        13: 3,  # 'ี'
-        40: 0,  # 'ึ'
-        27: 0,  # 'ื'
-        32: 1,  # 'ุ'
-        35: 0,  # 'ู'
-        11: 1,  # 'เ'
-        28: 2,  # 'à¹'
-        41: 0,  # 'โ'
-        29: 1,  # 'ใ'
-        33: 2,  # 'ไ'
-        50: 0,  # 'ๆ'
-        37: 3,  # '็'
-        6: 1,  # '่'
-        7: 2,  # '้'
-        38: 1,  # '์'
-        56: 0,  # '๑'
-        59: 0,  # '๒'
-        60: 0,  # '๕'
-    },
-    39: {  # 'ผ'
-        5: 1,  # 'à¸'
-        30: 0,  # 'ข'
-        24: 0,  # 'ค'
-        8: 1,  # 'ง'
-        26: 0,  # 'จ'
-        52: 0,  # 'ฉ'
-        34: 0,  # 'ช'
-        51: 0,  # 'ซ'
-        47: 0,  # 'à¸'
-        58: 0,  # 'ฎ'
-        57: 0,  # 'à¸'
-        49: 0,  # 'à¸'
-        53: 0,  # 'ฑ'
-        55: 0,  # 'ฒ'
-        43: 0,  # 'ณ'
-        20: 0,  # 'ด'
-        19: 0,  # 'ต'
-        44: 0,  # 'ถ'
-        14: 0,  # 'ท'
-        48: 0,  # 'ธ'
-        3: 2,  # 'น'
-        17: 0,  # 'บ'
-        25: 0,  # 'ป'
-        39: 0,  # 'ผ'
-        62: 0,  # 'à¸'
-        31: 0,  # 'พ'
-        54: 0,  # 'ฟ'
-        45: 0,  # 'ภ'
-        9: 1,  # 'ม'
-        16: 2,  # 'ย'
-        2: 0,  # 'ร'
-        61: 0,  # 'ฤ'
-        15: 3,  # 'ล'
-        12: 0,  # 'ว'
-        42: 0,  # 'ศ'
-        46: 0,  # 'ษ'
-        18: 1,  # 'ส'
-        21: 0,  # 'ห'
-        4: 0,  # 'อ'
-        63: 0,  # 'ฯ'
-        22: 1,  # 'ะ'
-        10: 1,  # 'ั'
-        1: 0,  # 'า'
-        36: 0,  # 'ำ'
-        23: 2,  # 'ิ'
-        13: 0,  # 'ี'
-        40: 0,  # 'ึ'
-        27: 1,  # 'ื'
-        32: 0,  # 'ุ'
-        35: 3,  # 'ู'
-        11: 0,  # 'เ'
-        28: 0,  # 'à¹'
-        41: 0,  # 'โ'
-        29: 0,  # 'ใ'
-        33: 0,  # 'ไ'
-        50: 0,  # 'ๆ'
-        37: 0,  # '็'
-        6: 3,  # '่'
-        7: 1,  # '้'
-        38: 0,  # '์'
-        56: 0,  # '๑'
-        59: 0,  # '๒'
-        60: 0,  # '๕'
-    },
-    62: {  # 'à¸'
-        5: 0,  # 'à¸'
-        30: 0,  # 'ข'
-        24: 0,  # 'ค'
-        8: 0,  # 'ง'
-        26: 0,  # 'จ'
-        52: 0,  # 'ฉ'
-        34: 0,  # 'ช'
-        51: 0,  # 'ซ'
-        47: 0,  # 'à¸'
-        58: 0,  # 'ฎ'
-        57: 0,  # 'à¸'
-        49: 0,  # 'à¸'
-        53: 0,  # 'ฑ'
-        55: 0,  # 'ฒ'
-        43: 0,  # 'ณ'
-        20: 0,  # 'ด'
-        19: 0,  # 'ต'
-        44: 0,  # 'ถ'
-        14: 0,  # 'ท'
-        48: 0,  # 'ธ'
-        3: 1,  # 'น'
-        17: 0,  # 'บ'
-        25: 0,  # 'ป'
-        39: 0,  # 'ผ'
-        62: 0,  # 'à¸'
-        31: 0,  # 'พ'
-        54: 0,  # 'ฟ'
-        45: 0,  # 'ภ'
-        9: 0,  # 'ม'
-        16: 0,  # 'ย'
-        2: 1,  # 'ร'
-        61: 0,  # 'ฤ'
-        15: 0,  # 'ล'
-        12: 0,  # 'ว'
-        42: 0,  # 'ศ'
-        46: 0,  # 'ษ'
-        18: 0,  # 'ส'
-        21: 0,  # 'ห'
-        4: 0,  # 'อ'
-        63: 0,  # 'ฯ'
-        22: 0,  # 'ะ'
-        10: 1,  # 'ั'
-        1: 0,  # 'า'
-        36: 0,  # 'ำ'
-        23: 0,  # 'ิ'
-        13: 1,  # 'ี'
-        40: 2,  # 'ึ'
-        27: 0,  # 'ื'
-        32: 0,  # 'ุ'
-        35: 0,  # 'ู'
-        11: 0,  # 'เ'
-        28: 0,  # 'à¹'
-        41: 0,  # 'โ'
-        29: 0,  # 'ใ'
-        33: 0,  # 'ไ'
-        50: 0,  # 'ๆ'
-        37: 0,  # '็'
-        6: 2,  # '่'
-        7: 1,  # '้'
-        38: 0,  # '์'
-        56: 0,  # '๑'
-        59: 0,  # '๒'
-        60: 0,  # '๕'
-    },
-    31: {  # 'พ'
-        5: 1,  # 'à¸'
-        30: 1,  # 'ข'
-        24: 1,  # 'ค'
-        8: 1,  # 'ง'
-        26: 1,  # 'จ'
-        52: 0,  # 'ฉ'
-        34: 0,  # 'ช'
-        51: 0,  # 'ซ'
-        47: 0,  # 'à¸'
-        58: 0,  # 'ฎ'
-        57: 0,  # 'à¸'
-        49: 0,  # 'à¸'
-        53: 0,  # 'ฑ'
-        55: 0,  # 'ฒ'
-        43: 1,  # 'ณ'
-        20: 1,  # 'ด'
-        19: 1,  # 'ต'
-        44: 0,  # 'ถ'
-        14: 2,  # 'ท'
-        48: 1,  # 'ธ'
-        3: 3,  # 'น'
-        17: 2,  # 'บ'
-        25: 0,  # 'ป'
-        39: 1,  # 'ผ'
-        62: 0,  # 'à¸'
-        31: 1,  # 'พ'
-        54: 0,  # 'ฟ'
-        45: 0,  # 'ภ'
-        9: 1,  # 'ม'
-        16: 2,  # 'ย'
-        2: 3,  # 'ร'
-        61: 2,  # 'ฤ'
-        15: 2,  # 'ล'
-        12: 2,  # 'ว'
-        42: 0,  # 'ศ'
-        46: 0,  # 'ษ'
-        18: 1,  # 'ส'
-        21: 1,  # 'ห'
-        4: 2,  # 'อ'
-        63: 1,  # 'ฯ'
-        22: 0,  # 'ะ'
-        10: 3,  # 'ั'
-        1: 3,  # 'า'
-        36: 0,  # 'ำ'
-        23: 3,  # 'ิ'
-        13: 2,  # 'ี'
-        40: 1,  # 'ึ'
-        27: 3,  # 'ื'
-        32: 1,  # 'ุ'
-        35: 2,  # 'ู'
-        11: 1,  # 'เ'
-        28: 1,  # 'à¹'
-        41: 0,  # 'โ'
-        29: 1,  # 'ใ'
-        33: 1,  # 'ไ'
-        50: 0,  # 'ๆ'
-        37: 1,  # '็'
-        6: 0,  # '่'
-        7: 1,  # '้'
-        38: 3,  # '์'
-        56: 0,  # '๑'
-        59: 0,  # '๒'
-        60: 0,  # '๕'
-    },
-    54: {  # 'ฟ'
-        5: 0,  # 'à¸'
-        30: 0,  # 'ข'
-        24: 0,  # 'ค'
-        8: 0,  # 'ง'
-        26: 0,  # 'จ'
-        52: 0,  # 'ฉ'
-        34: 1,  # 'ช'
-        51: 0,  # 'ซ'
-        47: 0,  # 'à¸'
-        58: 0,  # 'ฎ'
-        57: 0,  # 'à¸'
-        49: 0,  # 'à¸'
-        53: 0,  # 'ฑ'
-        55: 0,  # 'ฒ'
-        43: 0,  # 'ณ'
-        20: 0,  # 'ด'
-        19: 1,  # 'ต'
-        44: 0,  # 'ถ'
-        14: 1,  # 'ท'
-        48: 0,  # 'ธ'
-        3: 0,  # 'น'
-        17: 0,  # 'บ'
-        25: 0,  # 'ป'
-        39: 0,  # 'ผ'
-        62: 0,  # 'à¸'
-        31: 0,  # 'พ'
-        54: 2,  # 'ฟ'
-        45: 0,  # 'ภ'
-        9: 0,  # 'ม'
-        16: 0,  # 'ย'
-        2: 1,  # 'ร'
-        61: 0,  # 'ฤ'
-        15: 2,  # 'ล'
-        12: 0,  # 'ว'
-        42: 0,  # 'ศ'
-        46: 0,  # 'ษ'
-        18: 1,  # 'ส'
-        21: 0,  # 'ห'
-        4: 1,  # 'อ'
-        63: 0,  # 'ฯ'
-        22: 0,  # 'ะ'
-        10: 2,  # 'ั'
-        1: 0,  # 'า'
-        36: 0,  # 'ำ'
-        23: 1,  # 'ิ'
-        13: 1,  # 'ี'
-        40: 0,  # 'ึ'
-        27: 1,  # 'ื'
-        32: 1,  # 'ุ'
-        35: 0,  # 'ู'
-        11: 0,  # 'เ'
-        28: 1,  # 'à¹'
-        41: 0,  # 'โ'
-        29: 0,  # 'ใ'
-        33: 0,  # 'ไ'
-        50: 0,  # 'ๆ'
-        37: 0,  # '็'
-        6: 0,  # '่'
-        7: 2,  # '้'
-        38: 0,  # '์'
-        56: 0,  # '๑'
-        59: 0,  # '๒'
-        60: 0,  # '๕'
-    },
-    45: {  # 'ภ'
-        5: 0,  # 'à¸'
-        30: 0,  # 'ข'
-        24: 1,  # 'ค'
-        8: 0,  # 'ง'
-        26: 0,  # 'จ'
-        52: 0,  # 'ฉ'
-        34: 0,  # 'ช'
-        51: 0,  # 'ซ'
-        47: 0,  # 'à¸'
-        58: 0,  # 'ฎ'
-        57: 0,  # 'à¸'
-        49: 0,  # 'à¸'
-        53: 0,  # 'ฑ'
-        55: 0,  # 'ฒ'
-        43: 0,  # 'ณ'
-        20: 0,  # 'ด'
-        19: 0,  # 'ต'
-        44: 0,  # 'ถ'
-        14: 3,  # 'ท'
-        48: 0,  # 'ธ'
-        3: 0,  # 'น'
-        17: 0,  # 'บ'
-        25: 0,  # 'ป'
-        39: 0,  # 'ผ'
-        62: 0,  # 'à¸'
-        31: 1,  # 'พ'
-        54: 0,  # 'ฟ'
-        45: 0,  # 'ภ'
-        9: 0,  # 'ม'
-        16: 0,  # 'ย'
-        2: 1,  # 'ร'
-        61: 0,  # 'ฤ'
-        15: 0,  # 'ล'
-        12: 0,  # 'ว'
-        42: 0,  # 'ศ'
-        46: 0,  # 'ษ'
-        18: 0,  # 'ส'
-        21: 0,  # 'ห'
-        4: 0,  # 'อ'
-        63: 0,  # 'ฯ'
-        22: 0,  # 'ะ'
-        10: 3,  # 'ั'
-        1: 3,  # 'า'
-        36: 0,  # 'ำ'
-        23: 1,  # 'ิ'
-        13: 0,  # 'ี'
-        40: 0,  # 'ึ'
-        27: 0,  # 'ื'
-        32: 0,  # 'ุ'
-        35: 2,  # 'ู'
-        11: 0,  # 'เ'
-        28: 0,  # 'à¹'
-        41: 0,  # 'โ'
-        29: 0,  # 'ใ'
-        33: 0,  # 'ไ'
-        50: 0,  # 'ๆ'
-        37: 0,  # '็'
-        6: 0,  # '่'
-        7: 0,  # '้'
-        38: 1,  # '์'
-        56: 0,  # '๑'
-        59: 0,  # '๒'
-        60: 0,  # '๕'
-    },
-    9: {  # 'ม'
-        5: 2,  # 'à¸'
-        30: 2,  # 'ข'
-        24: 2,  # 'ค'
-        8: 2,  # 'ง'
-        26: 2,  # 'จ'
-        52: 0,  # 'ฉ'
-        34: 1,  # 'ช'
-        51: 1,  # 'ซ'
-        47: 0,  # 'à¸'
-        58: 0,  # 'ฎ'
-        57: 0,  # 'à¸'
-        49: 0,  # 'à¸'
-        53: 0,  # 'ฑ'
-        55: 0,  # 'ฒ'
-        43: 1,  # 'ณ'
-        20: 2,  # 'ด'
-        19: 2,  # 'ต'
-        44: 1,  # 'ถ'
-        14: 2,  # 'ท'
-        48: 1,  # 'ธ'
-        3: 3,  # 'น'
-        17: 2,  # 'บ'
-        25: 2,  # 'ป'
-        39: 1,  # 'ผ'
-        62: 0,  # 'à¸'
-        31: 3,  # 'พ'
-        54: 0,  # 'ฟ'
-        45: 1,  # 'ภ'
-        9: 2,  # 'ม'
-        16: 1,  # 'ย'
-        2: 2,  # 'ร'
-        61: 2,  # 'ฤ'
-        15: 2,  # 'ล'
-        12: 2,  # 'ว'
-        42: 1,  # 'ศ'
-        46: 1,  # 'ษ'
-        18: 3,  # 'ส'
-        21: 3,  # 'ห'
-        4: 3,  # 'อ'
-        63: 0,  # 'ฯ'
-        22: 1,  # 'ะ'
-        10: 3,  # 'ั'
-        1: 3,  # 'า'
-        36: 0,  # 'ำ'
-        23: 3,  # 'ิ'
-        13: 3,  # 'ี'
-        40: 0,  # 'ึ'
-        27: 3,  # 'ื'
-        32: 3,  # 'ุ'
-        35: 3,  # 'ู'
-        11: 2,  # 'เ'
-        28: 2,  # 'à¹'
-        41: 2,  # 'โ'
-        29: 2,  # 'ใ'
-        33: 2,  # 'ไ'
-        50: 1,  # 'ๆ'
-        37: 1,  # '็'
-        6: 3,  # '่'
-        7: 2,  # '้'
-        38: 1,  # '์'
-        56: 0,  # '๑'
-        59: 0,  # '๒'
-        60: 0,  # '๕'
-    },
-    16: {  # 'ย'
-        5: 3,  # 'à¸'
-        30: 1,  # 'ข'
-        24: 2,  # 'ค'
-        8: 3,  # 'ง'
-        26: 2,  # 'จ'
-        52: 0,  # 'ฉ'
-        34: 2,  # 'ช'
-        51: 0,  # 'ซ'
-        47: 2,  # 'à¸'
-        58: 0,  # 'ฎ'
-        57: 0,  # 'à¸'
-        49: 0,  # 'à¸'
-        53: 0,  # 'ฑ'
-        55: 0,  # 'ฒ'
-        43: 0,  # 'ณ'
-        20: 2,  # 'ด'
-        19: 2,  # 'ต'
-        44: 1,  # 'ถ'
-        14: 2,  # 'ท'
-        48: 1,  # 'ธ'
-        3: 3,  # 'น'
-        17: 3,  # 'บ'
-        25: 1,  # 'ป'
-        39: 1,  # 'ผ'
-        62: 0,  # 'à¸'
-        31: 1,  # 'พ'
-        54: 0,  # 'ฟ'
-        45: 1,  # 'ภ'
-        9: 2,  # 'ม'
-        16: 0,  # 'ย'
-        2: 2,  # 'ร'
-        61: 0,  # 'ฤ'
-        15: 1,  # 'ล'
-        12: 3,  # 'ว'
-        42: 1,  # 'ศ'
-        46: 0,  # 'ษ'
-        18: 2,  # 'ส'
-        21: 1,  # 'ห'
-        4: 2,  # 'อ'
-        63: 0,  # 'ฯ'
-        22: 2,  # 'ะ'
-        10: 3,  # 'ั'
-        1: 3,  # 'า'
-        36: 0,  # 'ำ'
-        23: 2,  # 'ิ'
-        13: 3,  # 'ี'
-        40: 1,  # 'ึ'
-        27: 2,  # 'ื'
-        32: 2,  # 'ุ'
-        35: 3,  # 'ู'
-        11: 2,  # 'เ'
-        28: 1,  # 'à¹'
-        41: 1,  # 'โ'
-        29: 2,  # 'ใ'
-        33: 2,  # 'ไ'
-        50: 2,  # 'ๆ'
-        37: 1,  # '็'
-        6: 3,  # '่'
-        7: 2,  # '้'
-        38: 3,  # '์'
-        56: 0,  # '๑'
-        59: 0,  # '๒'
-        60: 0,  # '๕'
-    },
-    2: {  # 'ร'
-        5: 3,  # 'à¸'
-        30: 2,  # 'ข'
-        24: 2,  # 'ค'
-        8: 3,  # 'ง'
-        26: 2,  # 'จ'
-        52: 0,  # 'ฉ'
-        34: 2,  # 'ช'
-        51: 1,  # 'ซ'
-        47: 0,  # 'à¸'
-        58: 0,  # 'ฎ'
-        57: 0,  # 'à¸'
-        49: 3,  # 'à¸'
-        53: 0,  # 'ฑ'
-        55: 0,  # 'ฒ'
-        43: 3,  # 'ณ'
-        20: 2,  # 'ด'
-        19: 2,  # 'ต'
-        44: 3,  # 'ถ'
-        14: 3,  # 'ท'
-        48: 1,  # 'ธ'
-        3: 2,  # 'น'
-        17: 2,  # 'บ'
-        25: 3,  # 'ป'
-        39: 2,  # 'ผ'
-        62: 1,  # 'à¸'
-        31: 2,  # 'พ'
-        54: 1,  # 'ฟ'
-        45: 1,  # 'ภ'
-        9: 3,  # 'ม'
-        16: 2,  # 'ย'
-        2: 3,  # 'ร'
-        61: 0,  # 'ฤ'
-        15: 2,  # 'ล'
-        12: 3,  # 'ว'
-        42: 2,  # 'ศ'
-        46: 2,  # 'ษ'
-        18: 2,  # 'ส'
-        21: 2,  # 'ห'
-        4: 3,  # 'อ'
-        63: 1,  # 'ฯ'
-        22: 3,  # 'ะ'
-        10: 3,  # 'ั'
-        1: 3,  # 'า'
-        36: 0,  # 'ำ'
-        23: 3,  # 'ิ'
-        13: 3,  # 'ี'
-        40: 2,  # 'ึ'
-        27: 3,  # 'ื'
-        32: 3,  # 'ุ'
-        35: 3,  # 'ู'
-        11: 3,  # 'เ'
-        28: 3,  # 'à¹'
-        41: 1,  # 'โ'
-        29: 2,  # 'ใ'
-        33: 1,  # 'ไ'
-        50: 0,  # 'ๆ'
-        37: 3,  # '็'
-        6: 3,  # '่'
-        7: 3,  # '้'
-        38: 3,  # '์'
-        56: 0,  # '๑'
-        59: 0,  # '๒'
-        60: 0,  # '๕'
-    },
-    61: {  # 'ฤ'
-        5: 0,  # 'à¸'
-        30: 0,  # 'ข'
-        24: 0,  # 'ค'
-        8: 0,  # 'ง'
-        26: 0,  # 'จ'
-        52: 0,  # 'ฉ'
-        34: 0,  # 'ช'
-        51: 0,  # 'ซ'
-        47: 0,  # 'à¸'
-        58: 0,  # 'ฎ'
-        57: 0,  # 'à¸'
-        49: 0,  # 'à¸'
-        53: 0,  # 'ฑ'
-        55: 0,  # 'ฒ'
-        43: 0,  # 'ณ'
-        20: 0,  # 'ด'
-        19: 2,  # 'ต'
-        44: 0,  # 'ถ'
-        14: 2,  # 'ท'
-        48: 0,  # 'ธ'
-        3: 0,  # 'น'
-        17: 0,  # 'บ'
-        25: 0,  # 'ป'
-        39: 0,  # 'ผ'
-        62: 0,  # 'à¸'
-        31: 0,  # 'พ'
-        54: 0,  # 'ฟ'
-        45: 0,  # 'ภ'
-        9: 1,  # 'ม'
-        16: 0,  # 'ย'
-        2: 0,  # 'ร'
-        61: 0,  # 'ฤ'
-        15: 0,  # 'ล'
-        12: 0,  # 'ว'
-        42: 0,  # 'ศ'
-        46: 2,  # 'ษ'
-        18: 0,  # 'ส'
-        21: 0,  # 'ห'
-        4: 0,  # 'อ'
-        63: 0,  # 'ฯ'
-        22: 0,  # 'ะ'
-        10: 0,  # 'ั'
-        1: 0,  # 'า'
-        36: 0,  # 'ำ'
-        23: 0,  # 'ิ'
-        13: 0,  # 'ี'
-        40: 0,  # 'ึ'
-        27: 0,  # 'ื'
-        32: 0,  # 'ุ'
-        35: 0,  # 'ู'
-        11: 0,  # 'เ'
-        28: 0,  # 'à¹'
-        41: 0,  # 'โ'
-        29: 0,  # 'ใ'
-        33: 0,  # 'ไ'
-        50: 0,  # 'ๆ'
-        37: 0,  # '็'
-        6: 0,  # '่'
-        7: 0,  # '้'
-        38: 0,  # '์'
-        56: 0,  # '๑'
-        59: 0,  # '๒'
-        60: 0,  # '๕'
-    },
-    15: {  # 'ล'
-        5: 2,  # 'à¸'
-        30: 3,  # 'ข'
-        24: 1,  # 'ค'
-        8: 3,  # 'ง'
-        26: 1,  # 'จ'
-        52: 0,  # 'ฉ'
-        34: 1,  # 'ช'
-        51: 0,  # 'ซ'
-        47: 0,  # 'à¸'
-        58: 0,  # 'ฎ'
-        57: 0,  # 'à¸'
-        49: 0,  # 'à¸'
-        53: 0,  # 'ฑ'
-        55: 0,  # 'ฒ'
-        43: 0,  # 'ณ'
-        20: 2,  # 'ด'
-        19: 2,  # 'ต'
-        44: 1,  # 'ถ'
-        14: 2,  # 'ท'
-        48: 0,  # 'ธ'
-        3: 1,  # 'น'
-        17: 2,  # 'บ'
-        25: 2,  # 'ป'
-        39: 1,  # 'ผ'
-        62: 0,  # 'à¸'
-        31: 0,  # 'พ'
-        54: 0,  # 'ฟ'
-        45: 1,  # 'ภ'
-        9: 1,  # 'ม'
-        16: 3,  # 'ย'
-        2: 1,  # 'ร'
-        61: 0,  # 'ฤ'
-        15: 1,  # 'ล'
-        12: 1,  # 'ว'
-        42: 0,  # 'ศ'
-        46: 0,  # 'ษ'
-        18: 2,  # 'ส'
-        21: 1,  # 'ห'
-        4: 3,  # 'อ'
-        63: 2,  # 'ฯ'
-        22: 3,  # 'ะ'
-        10: 3,  # 'ั'
-        1: 3,  # 'า'
-        36: 2,  # 'ำ'
-        23: 3,  # 'ิ'
-        13: 3,  # 'ี'
-        40: 2,  # 'ึ'
-        27: 3,  # 'ื'
-        32: 2,  # 'ุ'
-        35: 3,  # 'ู'
-        11: 2,  # 'เ'
-        28: 1,  # 'à¹'
-        41: 1,  # 'โ'
-        29: 2,  # 'ใ'
-        33: 1,  # 'ไ'
-        50: 0,  # 'ๆ'
-        37: 2,  # '็'
-        6: 3,  # '่'
-        7: 3,  # '้'
-        38: 2,  # '์'
-        56: 0,  # '๑'
-        59: 0,  # '๒'
-        60: 0,  # '๕'
-    },
-    12: {  # 'ว'
-        5: 3,  # 'à¸'
-        30: 2,  # 'ข'
-        24: 1,  # 'ค'
-        8: 3,  # 'ง'
-        26: 2,  # 'จ'
-        52: 0,  # 'ฉ'
-        34: 1,  # 'ช'
-        51: 1,  # 'ซ'
-        47: 0,  # 'à¸'
-        58: 0,  # 'ฎ'
-        57: 0,  # 'à¸'
-        49: 0,  # 'à¸'
-        53: 0,  # 'ฑ'
-        55: 0,  # 'ฒ'
-        43: 1,  # 'ณ'
-        20: 2,  # 'ด'
-        19: 1,  # 'ต'
-        44: 1,  # 'ถ'
-        14: 1,  # 'ท'
-        48: 0,  # 'ธ'
-        3: 3,  # 'น'
-        17: 2,  # 'บ'
-        25: 1,  # 'ป'
-        39: 1,  # 'ผ'
-        62: 0,  # 'à¸'
-        31: 1,  # 'พ'
-        54: 1,  # 'ฟ'
-        45: 0,  # 'ภ'
-        9: 3,  # 'ม'
-        16: 3,  # 'ย'
-        2: 3,  # 'ร'
-        61: 0,  # 'ฤ'
-        15: 3,  # 'ล'
-        12: 1,  # 'ว'
-        42: 0,  # 'ศ'
-        46: 0,  # 'ษ'
-        18: 2,  # 'ส'
-        21: 2,  # 'ห'
-        4: 2,  # 'อ'
-        63: 0,  # 'ฯ'
-        22: 2,  # 'ะ'
-        10: 3,  # 'ั'
-        1: 3,  # 'า'
-        36: 0,  # 'ำ'
-        23: 3,  # 'ิ'
-        13: 2,  # 'ี'
-        40: 0,  # 'ึ'
-        27: 0,  # 'ื'
-        32: 2,  # 'ุ'
-        35: 0,  # 'ู'
-        11: 3,  # 'เ'
-        28: 2,  # 'à¹'
-        41: 1,  # 'โ'
-        29: 1,  # 'ใ'
-        33: 2,  # 'ไ'
-        50: 1,  # 'ๆ'
-        37: 0,  # '็'
-        6: 3,  # '่'
-        7: 3,  # '้'
-        38: 1,  # '์'
-        56: 0,  # '๑'
-        59: 0,  # '๒'
-        60: 0,  # '๕'
-    },
-    42: {  # 'ศ'
-        5: 1,  # 'à¸'
-        30: 0,  # 'ข'
-        24: 1,  # 'ค'
-        8: 0,  # 'ง'
-        26: 1,  # 'จ'
-        52: 0,  # 'ฉ'
-        34: 0,  # 'ช'
-        51: 0,  # 'ซ'
-        47: 1,  # 'à¸'
-        58: 0,  # 'ฎ'
-        57: 0,  # 'à¸'
-        49: 0,  # 'à¸'
-        53: 0,  # 'ฑ'
-        55: 0,  # 'ฒ'
-        43: 0,  # 'ณ'
-        20: 0,  # 'ด'
-        19: 1,  # 'ต'
-        44: 0,  # 'ถ'
-        14: 1,  # 'ท'
-        48: 0,  # 'ธ'
-        3: 2,  # 'น'
-        17: 0,  # 'บ'
-        25: 0,  # 'ป'
-        39: 0,  # 'ผ'
-        62: 0,  # 'à¸'
-        31: 0,  # 'พ'
-        54: 0,  # 'ฟ'
-        45: 0,  # 'ภ'
-        9: 0,  # 'ม'
-        16: 0,  # 'ย'
-        2: 2,  # 'ร'
-        61: 0,  # 'ฤ'
-        15: 0,  # 'ล'
-        12: 2,  # 'ว'
-        42: 1,  # 'ศ'
-        46: 2,  # 'ษ'
-        18: 1,  # 'ส'
-        21: 0,  # 'ห'
-        4: 0,  # 'อ'
-        63: 0,  # 'ฯ'
-        22: 0,  # 'ะ'
-        10: 2,  # 'ั'
-        1: 3,  # 'า'
-        36: 0,  # 'ำ'
-        23: 2,  # 'ิ'
-        13: 0,  # 'ี'
-        40: 3,  # 'ึ'
-        27: 0,  # 'ื'
-        32: 0,  # 'ุ'
-        35: 2,  # 'ู'
-        11: 0,  # 'เ'
-        28: 1,  # 'à¹'
-        41: 0,  # 'โ'
-        29: 1,  # 'ใ'
-        33: 1,  # 'ไ'
-        50: 0,  # 'ๆ'
-        37: 0,  # '็'
-        6: 0,  # '่'
-        7: 0,  # '้'
-        38: 1,  # '์'
-        56: 0,  # '๑'
-        59: 0,  # '๒'
-        60: 0,  # '๕'
-    },
-    46: {  # 'ษ'
-        5: 0,  # 'à¸'
-        30: 0,  # 'ข'
-        24: 0,  # 'ค'
-        8: 0,  # 'ง'
-        26: 0,  # 'จ'
-        52: 0,  # 'ฉ'
-        34: 0,  # 'ช'
-        51: 0,  # 'ซ'
-        47: 0,  # 'à¸'
-        58: 2,  # 'ฎ'
-        57: 1,  # 'à¸'
-        49: 2,  # 'à¸'
-        53: 0,  # 'ฑ'
-        55: 0,  # 'ฒ'
-        43: 3,  # 'ณ'
-        20: 0,  # 'ด'
-        19: 1,  # 'ต'
-        44: 0,  # 'ถ'
-        14: 1,  # 'ท'
-        48: 0,  # 'ธ'
-        3: 0,  # 'น'
-        17: 0,  # 'บ'
-        25: 0,  # 'ป'
-        39: 0,  # 'ผ'
-        62: 0,  # 'à¸'
-        31: 0,  # 'พ'
-        54: 0,  # 'ฟ'
-        45: 1,  # 'ภ'
-        9: 1,  # 'ม'
-        16: 2,  # 'ย'
-        2: 2,  # 'ร'
-        61: 0,  # 'ฤ'
-        15: 0,  # 'ล'
-        12: 0,  # 'ว'
-        42: 1,  # 'ศ'
-        46: 0,  # 'ษ'
-        18: 0,  # 'ส'
-        21: 0,  # 'ห'
-        4: 0,  # 'อ'
-        63: 0,  # 'ฯ'
-        22: 2,  # 'ะ'
-        10: 2,  # 'ั'
-        1: 3,  # 'า'
-        36: 0,  # 'ำ'
-        23: 0,  # 'ิ'
-        13: 1,  # 'ี'
-        40: 0,  # 'ึ'
-        27: 0,  # 'ื'
-        32: 0,  # 'ุ'
-        35: 0,  # 'ู'
-        11: 1,  # 'เ'
-        28: 0,  # 'à¹'
-        41: 0,  # 'โ'
-        29: 0,  # 'ใ'
-        33: 0,  # 'ไ'
-        50: 0,  # 'ๆ'
-        37: 0,  # '็'
-        6: 0,  # '่'
-        7: 0,  # '้'
-        38: 2,  # '์'
-        56: 0,  # '๑'
-        59: 0,  # '๒'
-        60: 0,  # '๕'
-    },
-    18: {  # 'ส'
-        5: 2,  # 'à¸'
-        30: 0,  # 'ข'
-        24: 0,  # 'ค'
-        8: 2,  # 'ง'
-        26: 1,  # 'จ'
-        52: 0,  # 'ฉ'
-        34: 0,  # 'ช'
-        51: 0,  # 'ซ'
-        47: 0,  # 'à¸'
-        58: 0,  # 'ฎ'
-        57: 0,  # 'à¸'
-        49: 0,  # 'à¸'
-        53: 0,  # 'ฑ'
-        55: 0,  # 'ฒ'
-        43: 0,  # 'ณ'
-        20: 3,  # 'ด'
-        19: 3,  # 'ต'
-        44: 3,  # 'ถ'
-        14: 0,  # 'ท'
-        48: 0,  # 'ธ'
-        3: 3,  # 'น'
-        17: 2,  # 'บ'
-        25: 1,  # 'ป'
-        39: 0,  # 'ผ'
-        62: 0,  # 'à¸'
-        31: 0,  # 'พ'
-        54: 0,  # 'ฟ'
-        45: 2,  # 'ภ'
-        9: 3,  # 'ม'
-        16: 1,  # 'ย'
-        2: 3,  # 'ร'
-        61: 0,  # 'ฤ'
-        15: 1,  # 'ล'
-        12: 2,  # 'ว'
-        42: 0,  # 'ศ'
-        46: 0,  # 'ษ'
-        18: 0,  # 'ส'
-        21: 2,  # 'ห'
-        4: 3,  # 'อ'
-        63: 0,  # 'ฯ'
-        22: 2,  # 'ะ'
-        10: 3,  # 'ั'
-        1: 3,  # 'า'
-        36: 3,  # 'ำ'
-        23: 3,  # 'ิ'
-        13: 3,  # 'ี'
-        40: 2,  # 'ึ'
-        27: 3,  # 'ื'
-        32: 3,  # 'ุ'
-        35: 3,  # 'ู'
-        11: 2,  # 'เ'
-        28: 0,  # 'à¹'
-        41: 1,  # 'โ'
-        29: 0,  # 'ใ'
-        33: 1,  # 'ไ'
-        50: 0,  # 'ๆ'
-        37: 0,  # '็'
-        6: 3,  # '่'
-        7: 1,  # '้'
-        38: 2,  # '์'
-        56: 0,  # '๑'
-        59: 0,  # '๒'
-        60: 0,  # '๕'
-    },
-    21: {  # 'ห'
-        5: 3,  # 'à¸'
-        30: 0,  # 'ข'
-        24: 0,  # 'ค'
-        8: 1,  # 'ง'
-        26: 0,  # 'จ'
-        52: 0,  # 'ฉ'
-        34: 0,  # 'ช'
-        51: 0,  # 'ซ'
-        47: 2,  # 'à¸'
-        58: 0,  # 'ฎ'
-        57: 0,  # 'à¸'
-        49: 0,  # 'à¸'
-        53: 0,  # 'ฑ'
-        55: 0,  # 'ฒ'
-        43: 0,  # 'ณ'
-        20: 1,  # 'ด'
-        19: 3,  # 'ต'
-        44: 0,  # 'ถ'
-        14: 0,  # 'ท'
-        48: 0,  # 'ธ'
-        3: 3,  # 'น'
-        17: 0,  # 'บ'
-        25: 1,  # 'ป'
-        39: 0,  # 'ผ'
-        62: 0,  # 'à¸'
-        31: 1,  # 'พ'
-        54: 0,  # 'ฟ'
-        45: 0,  # 'ภ'
-        9: 3,  # 'ม'
-        16: 2,  # 'ย'
-        2: 3,  # 'ร'
-        61: 0,  # 'ฤ'
-        15: 3,  # 'ล'
-        12: 2,  # 'ว'
-        42: 0,  # 'ศ'
-        46: 0,  # 'ษ'
-        18: 0,  # 'ส'
-        21: 0,  # 'ห'
-        4: 3,  # 'อ'
-        63: 0,  # 'ฯ'
-        22: 1,  # 'ะ'
-        10: 3,  # 'ั'
-        1: 3,  # 'า'
-        36: 0,  # 'ำ'
-        23: 1,  # 'ิ'
-        13: 1,  # 'ี'
-        40: 0,  # 'ึ'
-        27: 0,  # 'ื'
-        32: 1,  # 'ุ'
-        35: 1,  # 'ู'
-        11: 0,  # 'เ'
-        28: 0,  # 'à¹'
-        41: 0,  # 'โ'
-        29: 0,  # 'ใ'
-        33: 0,  # 'ไ'
-        50: 0,  # 'ๆ'
-        37: 3,  # '็'
-        6: 3,  # '่'
-        7: 3,  # '้'
-        38: 2,  # '์'
-        56: 0,  # '๑'
-        59: 0,  # '๒'
-        60: 0,  # '๕'
-    },
-    4: {  # 'อ'
-        5: 3,  # 'à¸'
-        30: 1,  # 'ข'
-        24: 2,  # 'ค'
-        8: 3,  # 'ง'
-        26: 1,  # 'จ'
-        52: 0,  # 'ฉ'
-        34: 1,  # 'ช'
-        51: 0,  # 'ซ'
-        47: 0,  # 'à¸'
-        58: 0,  # 'ฎ'
-        57: 0,  # 'à¸'
-        49: 0,  # 'à¸'
-        53: 0,  # 'ฑ'
-        55: 0,  # 'ฒ'
-        43: 0,  # 'ณ'
-        20: 3,  # 'ด'
-        19: 2,  # 'ต'
-        44: 1,  # 'ถ'
-        14: 2,  # 'ท'
-        48: 1,  # 'ธ'
-        3: 3,  # 'น'
-        17: 3,  # 'บ'
-        25: 1,  # 'ป'
-        39: 1,  # 'ผ'
-        62: 0,  # 'à¸'
-        31: 1,  # 'พ'
-        54: 1,  # 'ฟ'
-        45: 1,  # 'ภ'
-        9: 3,  # 'ม'
-        16: 3,  # 'ย'
-        2: 3,  # 'ร'
-        61: 0,  # 'ฤ'
-        15: 2,  # 'ล'
-        12: 2,  # 'ว'
-        42: 1,  # 'ศ'
-        46: 0,  # 'ษ'
-        18: 2,  # 'ส'
-        21: 2,  # 'ห'
-        4: 3,  # 'อ'
-        63: 0,  # 'ฯ'
-        22: 2,  # 'ะ'
-        10: 3,  # 'ั'
-        1: 3,  # 'า'
-        36: 2,  # 'ำ'
-        23: 2,  # 'ิ'
-        13: 3,  # 'ี'
-        40: 0,  # 'ึ'
-        27: 3,  # 'ื'
-        32: 3,  # 'ุ'
-        35: 0,  # 'ู'
-        11: 3,  # 'เ'
-        28: 1,  # 'à¹'
-        41: 1,  # 'โ'
-        29: 2,  # 'ใ'
-        33: 2,  # 'ไ'
-        50: 1,  # 'ๆ'
-        37: 1,  # '็'
-        6: 2,  # '่'
-        7: 2,  # '้'
-        38: 0,  # '์'
-        56: 0,  # '๑'
-        59: 0,  # '๒'
-        60: 0,  # '๕'
-    },
-    63: {  # 'ฯ'
-        5: 0,  # 'à¸'
-        30: 0,  # 'ข'
-        24: 0,  # 'ค'
-        8: 0,  # 'ง'
-        26: 0,  # 'จ'
-        52: 0,  # 'ฉ'
-        34: 0,  # 'ช'
-        51: 0,  # 'ซ'
-        47: 0,  # 'à¸'
-        58: 0,  # 'ฎ'
-        57: 0,  # 'à¸'
-        49: 0,  # 'à¸'
-        53: 0,  # 'ฑ'
-        55: 0,  # 'ฒ'
-        43: 0,  # 'ณ'
-        20: 0,  # 'ด'
-        19: 0,  # 'ต'
-        44: 0,  # 'ถ'
-        14: 0,  # 'ท'
-        48: 0,  # 'ธ'
-        3: 0,  # 'น'
-        17: 0,  # 'บ'
-        25: 0,  # 'ป'
-        39: 0,  # 'ผ'
-        62: 0,  # 'à¸'
-        31: 0,  # 'พ'
-        54: 0,  # 'ฟ'
-        45: 0,  # 'ภ'
-        9: 0,  # 'ม'
-        16: 0,  # 'ย'
-        2: 0,  # 'ร'
-        61: 0,  # 'ฤ'
-        15: 2,  # 'ล'
-        12: 0,  # 'ว'
-        42: 0,  # 'ศ'
-        46: 0,  # 'ษ'
-        18: 0,  # 'ส'
-        21: 0,  # 'ห'
-        4: 0,  # 'อ'
-        63: 0,  # 'ฯ'
-        22: 0,  # 'ะ'
-        10: 0,  # 'ั'
-        1: 0,  # 'า'
-        36: 0,  # 'ำ'
-        23: 0,  # 'ิ'
-        13: 0,  # 'ี'
-        40: 0,  # 'ึ'
-        27: 0,  # 'ื'
-        32: 0,  # 'ุ'
-        35: 0,  # 'ู'
-        11: 0,  # 'เ'
-        28: 0,  # 'à¹'
-        41: 0,  # 'โ'
-        29: 0,  # 'ใ'
-        33: 0,  # 'ไ'
-        50: 0,  # 'ๆ'
-        37: 0,  # '็'
-        6: 0,  # '่'
-        7: 0,  # '้'
-        38: 0,  # '์'
-        56: 0,  # '๑'
-        59: 0,  # '๒'
-        60: 0,  # '๕'
-    },
-    22: {  # 'ะ'
-        5: 3,  # 'à¸'
-        30: 1,  # 'ข'
-        24: 2,  # 'ค'
-        8: 1,  # 'ง'
-        26: 2,  # 'จ'
-        52: 0,  # 'ฉ'
-        34: 3,  # 'ช'
-        51: 0,  # 'ซ'
-        47: 0,  # 'à¸'
-        58: 0,  # 'ฎ'
-        57: 0,  # 'à¸'
-        49: 0,  # 'à¸'
-        53: 0,  # 'ฑ'
-        55: 0,  # 'ฒ'
-        43: 0,  # 'ณ'
-        20: 3,  # 'ด'
-        19: 3,  # 'ต'
-        44: 1,  # 'ถ'
-        14: 3,  # 'ท'
-        48: 1,  # 'ธ'
-        3: 2,  # 'น'
-        17: 3,  # 'บ'
-        25: 2,  # 'ป'
-        39: 1,  # 'ผ'
-        62: 0,  # 'à¸'
-        31: 2,  # 'พ'
-        54: 0,  # 'ฟ'
-        45: 1,  # 'ภ'
-        9: 3,  # 'ม'
-        16: 2,  # 'ย'
-        2: 2,  # 'ร'
-        61: 0,  # 'ฤ'
-        15: 2,  # 'ล'
-        12: 2,  # 'ว'
-        42: 0,  # 'ศ'
-        46: 0,  # 'ษ'
-        18: 3,  # 'ส'
-        21: 3,  # 'ห'
-        4: 2,  # 'อ'
-        63: 1,  # 'ฯ'
-        22: 1,  # 'ะ'
-        10: 0,  # 'ั'
-        1: 0,  # 'า'
-        36: 0,  # 'ำ'
-        23: 0,  # 'ิ'
-        13: 0,  # 'ี'
-        40: 0,  # 'ึ'
-        27: 0,  # 'ื'
-        32: 0,  # 'ุ'
-        35: 0,  # 'ู'
-        11: 3,  # 'เ'
-        28: 2,  # 'à¹'
-        41: 1,  # 'โ'
-        29: 2,  # 'ใ'
-        33: 2,  # 'ไ'
-        50: 0,  # 'ๆ'
-        37: 0,  # '็'
-        6: 0,  # '่'
-        7: 0,  # '้'
-        38: 0,  # '์'
-        56: 0,  # '๑'
-        59: 0,  # '๒'
-        60: 0,  # '๕'
-    },
-    10: {  # 'ั'
-        5: 3,  # 'à¸'
-        30: 0,  # 'ข'
-        24: 1,  # 'ค'
-        8: 3,  # 'ง'
-        26: 3,  # 'จ'
-        52: 0,  # 'ฉ'
-        34: 1,  # 'ช'
-        51: 0,  # 'ซ'
-        47: 3,  # 'à¸'
-        58: 0,  # 'ฎ'
-        57: 0,  # 'à¸'
-        49: 2,  # 'à¸'
-        53: 0,  # 'ฑ'
-        55: 3,  # 'ฒ'
-        43: 3,  # 'ณ'
-        20: 3,  # 'ด'
-        19: 3,  # 'ต'
-        44: 0,  # 'ถ'
-        14: 2,  # 'ท'
-        48: 0,  # 'ธ'
-        3: 3,  # 'น'
-        17: 3,  # 'บ'
-        25: 1,  # 'ป'
-        39: 0,  # 'ผ'
-        62: 0,  # 'à¸'
-        31: 2,  # 'พ'
-        54: 0,  # 'ฟ'
-        45: 0,  # 'ภ'
-        9: 3,  # 'ม'
-        16: 3,  # 'ย'
-        2: 0,  # 'ร'
-        61: 0,  # 'ฤ'
-        15: 2,  # 'ล'
-        12: 3,  # 'ว'
-        42: 2,  # 'ศ'
-        46: 0,  # 'ษ'
-        18: 3,  # 'ส'
-        21: 0,  # 'ห'
-        4: 0,  # 'อ'
-        63: 0,  # 'ฯ'
-        22: 0,  # 'ะ'
-        10: 0,  # 'ั'
-        1: 0,  # 'า'
-        36: 0,  # 'ำ'
-        23: 0,  # 'ิ'
-        13: 0,  # 'ี'
-        40: 0,  # 'ึ'
-        27: 0,  # 'ื'
-        32: 0,  # 'ุ'
-        35: 0,  # 'ู'
-        11: 0,  # 'เ'
-        28: 0,  # 'à¹'
-        41: 0,  # 'โ'
-        29: 0,  # 'ใ'
-        33: 0,  # 'ไ'
-        50: 0,  # 'ๆ'
-        37: 0,  # '็'
-        6: 3,  # '่'
-        7: 3,  # '้'
-        38: 0,  # '์'
-        56: 0,  # '๑'
-        59: 0,  # '๒'
-        60: 0,  # '๕'
-    },
-    1: {  # 'า'
-        5: 3,  # 'à¸'
-        30: 2,  # 'ข'
-        24: 3,  # 'ค'
-        8: 3,  # 'ง'
-        26: 3,  # 'จ'
-        52: 0,  # 'ฉ'
-        34: 3,  # 'ช'
-        51: 1,  # 'ซ'
-        47: 2,  # 'à¸'
-        58: 0,  # 'ฎ'
-        57: 0,  # 'à¸'
-        49: 0,  # 'à¸'
-        53: 0,  # 'ฑ'
-        55: 0,  # 'ฒ'
-        43: 3,  # 'ณ'
-        20: 3,  # 'ด'
-        19: 3,  # 'ต'
-        44: 1,  # 'ถ'
-        14: 3,  # 'ท'
-        48: 2,  # 'ธ'
-        3: 3,  # 'น'
-        17: 3,  # 'บ'
-        25: 2,  # 'ป'
-        39: 1,  # 'ผ'
-        62: 1,  # 'à¸'
-        31: 3,  # 'พ'
-        54: 1,  # 'ฟ'
-        45: 1,  # 'ภ'
-        9: 3,  # 'ม'
-        16: 3,  # 'ย'
-        2: 3,  # 'ร'
-        61: 0,  # 'ฤ'
-        15: 3,  # 'ล'
-        12: 3,  # 'ว'
-        42: 2,  # 'ศ'
-        46: 3,  # 'ษ'
-        18: 3,  # 'ส'
-        21: 3,  # 'ห'
-        4: 2,  # 'อ'
-        63: 1,  # 'ฯ'
-        22: 3,  # 'ะ'
-        10: 0,  # 'ั'
-        1: 0,  # 'า'
-        36: 0,  # 'ำ'
-        23: 0,  # 'ิ'
-        13: 0,  # 'ี'
-        40: 0,  # 'ึ'
-        27: 0,  # 'ื'
-        32: 0,  # 'ุ'
-        35: 0,  # 'ู'
-        11: 3,  # 'เ'
-        28: 2,  # 'à¹'
-        41: 1,  # 'โ'
-        29: 2,  # 'ใ'
-        33: 2,  # 'ไ'
-        50: 1,  # 'ๆ'
-        37: 0,  # '็'
-        6: 0,  # '่'
-        7: 0,  # '้'
-        38: 0,  # '์'
-        56: 0,  # '๑'
-        59: 0,  # '๒'
-        60: 0,  # '๕'
-    },
-    36: {  # 'ำ'
-        5: 2,  # 'à¸'
-        30: 1,  # 'ข'
-        24: 3,  # 'ค'
-        8: 2,  # 'ง'
-        26: 1,  # 'จ'
-        52: 0,  # 'ฉ'
-        34: 0,  # 'ช'
-        51: 0,  # 'ซ'
-        47: 0,  # 'à¸'
-        58: 0,  # 'ฎ'
-        57: 0,  # 'à¸'
-        49: 1,  # 'à¸'
-        53: 0,  # 'ฑ'
-        55: 0,  # 'ฒ'
-        43: 0,  # 'ณ'
-        20: 1,  # 'ด'
-        19: 1,  # 'ต'
-        44: 1,  # 'ถ'
-        14: 1,  # 'ท'
-        48: 0,  # 'ธ'
-        3: 3,  # 'น'
-        17: 1,  # 'บ'
-        25: 1,  # 'ป'
-        39: 1,  # 'ผ'
-        62: 0,  # 'à¸'
-        31: 1,  # 'พ'
-        54: 0,  # 'ฟ'
-        45: 1,  # 'ภ'
-        9: 1,  # 'ม'
-        16: 0,  # 'ย'
-        2: 2,  # 'ร'
-        61: 0,  # 'ฤ'
-        15: 2,  # 'ล'
-        12: 1,  # 'ว'
-        42: 0,  # 'ศ'
-        46: 0,  # 'ษ'
-        18: 1,  # 'ส'
-        21: 3,  # 'ห'
-        4: 1,  # 'อ'
-        63: 0,  # 'ฯ'
-        22: 0,  # 'ะ'
-        10: 0,  # 'ั'
-        1: 0,  # 'า'
-        36: 0,  # 'ำ'
-        23: 0,  # 'ิ'
-        13: 0,  # 'ี'
-        40: 0,  # 'ึ'
-        27: 0,  # 'ื'
-        32: 0,  # 'ุ'
-        35: 0,  # 'ู'
-        11: 3,  # 'เ'
-        28: 2,  # 'à¹'
-        41: 1,  # 'โ'
-        29: 2,  # 'ใ'
-        33: 2,  # 'ไ'
-        50: 0,  # 'ๆ'
-        37: 0,  # '็'
-        6: 0,  # '่'
-        7: 0,  # '้'
-        38: 0,  # '์'
-        56: 0,  # '๑'
-        59: 0,  # '๒'
-        60: 0,  # '๕'
-    },
-    23: {  # 'ิ'
-        5: 3,  # 'à¸'
-        30: 1,  # 'ข'
-        24: 2,  # 'ค'
-        8: 3,  # 'ง'
-        26: 3,  # 'จ'
-        52: 0,  # 'ฉ'
-        34: 3,  # 'ช'
-        51: 0,  # 'ซ'
-        47: 2,  # 'à¸'
-        58: 0,  # 'ฎ'
-        57: 0,  # 'à¸'
-        49: 0,  # 'à¸'
-        53: 0,  # 'ฑ'
-        55: 0,  # 'ฒ'
-        43: 0,  # 'ณ'
-        20: 3,  # 'ด'
-        19: 3,  # 'ต'
-        44: 1,  # 'ถ'
-        14: 3,  # 'ท'
-        48: 3,  # 'ธ'
-        3: 3,  # 'น'
-        17: 3,  # 'บ'
-        25: 2,  # 'ป'
-        39: 2,  # 'ผ'
-        62: 0,  # 'à¸'
-        31: 3,  # 'พ'
-        54: 1,  # 'ฟ'
-        45: 2,  # 'ภ'
-        9: 3,  # 'ม'
-        16: 2,  # 'ย'
-        2: 2,  # 'ร'
-        61: 0,  # 'ฤ'
-        15: 2,  # 'ล'
-        12: 3,  # 'ว'
-        42: 3,  # 'ศ'
-        46: 2,  # 'ษ'
-        18: 2,  # 'ส'
-        21: 3,  # 'ห'
-        4: 1,  # 'อ'
-        63: 1,  # 'ฯ'
-        22: 0,  # 'ะ'
-        10: 0,  # 'ั'
-        1: 0,  # 'า'
-        36: 0,  # 'ำ'
-        23: 0,  # 'ิ'
-        13: 0,  # 'ี'
-        40: 0,  # 'ึ'
-        27: 0,  # 'ื'
-        32: 0,  # 'ุ'
-        35: 0,  # 'ู'
-        11: 3,  # 'เ'
-        28: 1,  # 'à¹'
-        41: 1,  # 'โ'
-        29: 1,  # 'ใ'
-        33: 0,  # 'ไ'
-        50: 0,  # 'ๆ'
-        37: 0,  # '็'
-        6: 3,  # '่'
-        7: 2,  # '้'
-        38: 2,  # '์'
-        56: 0,  # '๑'
-        59: 0,  # '๒'
-        60: 0,  # '๕'
-    },
-    13: {  # 'ี'
-        5: 3,  # 'à¸'
-        30: 2,  # 'ข'
-        24: 2,  # 'ค'
-        8: 0,  # 'ง'
-        26: 1,  # 'จ'
-        52: 0,  # 'ฉ'
-        34: 1,  # 'ช'
-        51: 0,  # 'ซ'
-        47: 0,  # 'à¸'
-        58: 0,  # 'ฎ'
-        57: 0,  # 'à¸'
-        49: 0,  # 'à¸'
-        53: 0,  # 'ฑ'
-        55: 0,  # 'ฒ'
-        43: 0,  # 'ณ'
-        20: 2,  # 'ด'
-        19: 1,  # 'ต'
-        44: 0,  # 'ถ'
-        14: 2,  # 'ท'
-        48: 0,  # 'ธ'
-        3: 1,  # 'น'
-        17: 2,  # 'บ'
-        25: 2,  # 'ป'
-        39: 1,  # 'ผ'
-        62: 0,  # 'à¸'
-        31: 2,  # 'พ'
-        54: 0,  # 'ฟ'
-        45: 0,  # 'ภ'
-        9: 2,  # 'ม'
-        16: 3,  # 'ย'
-        2: 2,  # 'ร'
-        61: 0,  # 'ฤ'
-        15: 1,  # 'ล'
-        12: 2,  # 'ว'
-        42: 1,  # 'ศ'
-        46: 0,  # 'ษ'
-        18: 2,  # 'ส'
-        21: 1,  # 'ห'
-        4: 2,  # 'อ'
-        63: 0,  # 'ฯ'
-        22: 0,  # 'ะ'
-        10: 0,  # 'ั'
-        1: 0,  # 'า'
-        36: 0,  # 'ำ'
-        23: 0,  # 'ิ'
-        13: 0,  # 'ี'
-        40: 0,  # 'ึ'
-        27: 0,  # 'ื'
-        32: 0,  # 'ุ'
-        35: 0,  # 'ู'
-        11: 2,  # 'เ'
-        28: 2,  # 'à¹'
-        41: 1,  # 'โ'
-        29: 1,  # 'ใ'
-        33: 1,  # 'ไ'
-        50: 1,  # 'ๆ'
-        37: 0,  # '็'
-        6: 3,  # '่'
-        7: 3,  # '้'
-        38: 0,  # '์'
-        56: 0,  # '๑'
-        59: 0,  # '๒'
-        60: 0,  # '๕'
-    },
-    40: {  # 'ึ'
-        5: 3,  # 'à¸'
-        30: 0,  # 'ข'
-        24: 0,  # 'ค'
-        8: 3,  # 'ง'
-        26: 0,  # 'จ'
-        52: 0,  # 'ฉ'
-        34: 0,  # 'ช'
-        51: 0,  # 'ซ'
-        47: 0,  # 'à¸'
-        58: 0,  # 'ฎ'
-        57: 0,  # 'à¸'
-        49: 0,  # 'à¸'
-        53: 0,  # 'ฑ'
-        55: 0,  # 'ฒ'
-        43: 0,  # 'ณ'
-        20: 1,  # 'ด'
-        19: 0,  # 'ต'
-        44: 0,  # 'ถ'
-        14: 0,  # 'ท'
-        48: 0,  # 'ธ'
-        3: 0,  # 'น'
-        17: 0,  # 'บ'
-        25: 0,  # 'ป'
-        39: 0,  # 'ผ'
-        62: 0,  # 'à¸'
-        31: 0,  # 'พ'
-        54: 0,  # 'ฟ'
-        45: 0,  # 'ภ'
-        9: 1,  # 'ม'
-        16: 0,  # 'ย'
-        2: 0,  # 'ร'
-        61: 0,  # 'ฤ'
-        15: 0,  # 'ล'
-        12: 0,  # 'ว'
-        42: 0,  # 'ศ'
-        46: 0,  # 'ษ'
-        18: 0,  # 'ส'
-        21: 0,  # 'ห'
-        4: 0,  # 'อ'
-        63: 0,  # 'ฯ'
-        22: 0,  # 'ะ'
-        10: 0,  # 'ั'
-        1: 0,  # 'า'
-        36: 0,  # 'ำ'
-        23: 0,  # 'ิ'
-        13: 0,  # 'ี'
-        40: 0,  # 'ึ'
-        27: 0,  # 'ื'
-        32: 0,  # 'ุ'
-        35: 0,  # 'ู'
-        11: 0,  # 'เ'
-        28: 0,  # 'à¹'
-        41: 0,  # 'โ'
-        29: 0,  # 'ใ'
-        33: 0,  # 'ไ'
-        50: 0,  # 'ๆ'
-        37: 0,  # '็'
-        6: 3,  # '่'
-        7: 3,  # '้'
-        38: 0,  # '์'
-        56: 0,  # '๑'
-        59: 0,  # '๒'
-        60: 0,  # '๕'
-    },
-    27: {  # 'ื'
-        5: 0,  # 'à¸'
-        30: 0,  # 'ข'
-        24: 0,  # 'ค'
-        8: 0,  # 'ง'
-        26: 0,  # 'จ'
-        52: 0,  # 'ฉ'
-        34: 1,  # 'ช'
-        51: 0,  # 'ซ'
-        47: 0,  # 'à¸'
-        58: 0,  # 'ฎ'
-        57: 0,  # 'à¸'
-        49: 0,  # 'à¸'
-        53: 0,  # 'ฑ'
-        55: 0,  # 'ฒ'
-        43: 0,  # 'ณ'
-        20: 1,  # 'ด'
-        19: 0,  # 'ต'
-        44: 0,  # 'ถ'
-        14: 0,  # 'ท'
-        48: 0,  # 'ธ'
-        3: 2,  # 'น'
-        17: 3,  # 'บ'
-        25: 0,  # 'ป'
-        39: 0,  # 'ผ'
-        62: 0,  # 'à¸'
-        31: 0,  # 'พ'
-        54: 0,  # 'ฟ'
-        45: 0,  # 'ภ'
-        9: 2,  # 'ม'
-        16: 0,  # 'ย'
-        2: 0,  # 'ร'
-        61: 0,  # 'ฤ'
-        15: 0,  # 'ล'
-        12: 0,  # 'ว'
-        42: 0,  # 'ศ'
-        46: 0,  # 'ษ'
-        18: 0,  # 'ส'
-        21: 0,  # 'ห'
-        4: 3,  # 'อ'
-        63: 0,  # 'ฯ'
-        22: 0,  # 'ะ'
-        10: 0,  # 'ั'
-        1: 0,  # 'า'
-        36: 0,  # 'ำ'
-        23: 0,  # 'ิ'
-        13: 0,  # 'ี'
-        40: 0,  # 'ึ'
-        27: 0,  # 'ื'
-        32: 0,  # 'ุ'
-        35: 0,  # 'ู'
-        11: 0,  # 'เ'
-        28: 0,  # 'à¹'
-        41: 0,  # 'โ'
-        29: 0,  # 'ใ'
-        33: 0,  # 'ไ'
-        50: 0,  # 'ๆ'
-        37: 0,  # '็'
-        6: 3,  # '่'
-        7: 3,  # '้'
-        38: 0,  # '์'
-        56: 0,  # '๑'
-        59: 0,  # '๒'
-        60: 0,  # '๕'
-    },
-    32: {  # 'ุ'
-        5: 3,  # 'à¸'
-        30: 2,  # 'ข'
-        24: 3,  # 'ค'
-        8: 3,  # 'ง'
-        26: 0,  # 'จ'
-        52: 0,  # 'ฉ'
-        34: 0,  # 'ช'
-        51: 0,  # 'ซ'
-        47: 2,  # 'à¸'
-        58: 0,  # 'ฎ'
-        57: 0,  # 'à¸'
-        49: 0,  # 'à¸'
-        53: 0,  # 'ฑ'
-        55: 1,  # 'ฒ'
-        43: 3,  # 'ณ'
-        20: 3,  # 'ด'
-        19: 3,  # 'ต'
-        44: 1,  # 'ถ'
-        14: 2,  # 'ท'
-        48: 1,  # 'ธ'
-        3: 2,  # 'น'
-        17: 2,  # 'บ'
-        25: 2,  # 'ป'
-        39: 2,  # 'ผ'
-        62: 0,  # 'à¸'
-        31: 1,  # 'พ'
-        54: 0,  # 'ฟ'
-        45: 1,  # 'ภ'
-        9: 3,  # 'ม'
-        16: 1,  # 'ย'
-        2: 2,  # 'ร'
-        61: 0,  # 'ฤ'
-        15: 2,  # 'ล'
-        12: 1,  # 'ว'
-        42: 1,  # 'ศ'
-        46: 2,  # 'ษ'
-        18: 1,  # 'ส'
-        21: 1,  # 'ห'
-        4: 1,  # 'อ'
-        63: 0,  # 'ฯ'
-        22: 0,  # 'ะ'
-        10: 0,  # 'ั'
-        1: 0,  # 'า'
-        36: 0,  # 'ำ'
-        23: 0,  # 'ิ'
-        13: 0,  # 'ี'
-        40: 0,  # 'ึ'
-        27: 0,  # 'ื'
-        32: 0,  # 'ุ'
-        35: 0,  # 'ู'
-        11: 1,  # 'เ'
-        28: 0,  # 'à¹'
-        41: 1,  # 'โ'
-        29: 0,  # 'ใ'
-        33: 1,  # 'ไ'
-        50: 0,  # 'ๆ'
-        37: 0,  # '็'
-        6: 3,  # '่'
-        7: 2,  # '้'
-        38: 1,  # '์'
-        56: 0,  # '๑'
-        59: 0,  # '๒'
-        60: 0,  # '๕'
-    },
-    35: {  # 'ู'
-        5: 3,  # 'à¸'
-        30: 0,  # 'ข'
-        24: 0,  # 'ค'
-        8: 2,  # 'ง'
-        26: 1,  # 'จ'
-        52: 0,  # 'ฉ'
-        34: 0,  # 'ช'
-        51: 0,  # 'ซ'
-        47: 2,  # 'à¸'
-        58: 0,  # 'ฎ'
-        57: 0,  # 'à¸'
-        49: 0,  # 'à¸'
-        53: 0,  # 'ฑ'
-        55: 0,  # 'ฒ'
-        43: 1,  # 'ณ'
-        20: 2,  # 'ด'
-        19: 2,  # 'ต'
-        44: 0,  # 'ถ'
-        14: 1,  # 'ท'
-        48: 0,  # 'ธ'
-        3: 2,  # 'น'
-        17: 0,  # 'บ'
-        25: 3,  # 'ป'
-        39: 0,  # 'ผ'
-        62: 0,  # 'à¸'
-        31: 0,  # 'พ'
-        54: 0,  # 'ฟ'
-        45: 0,  # 'ภ'
-        9: 2,  # 'ม'
-        16: 0,  # 'ย'
-        2: 1,  # 'ร'
-        61: 0,  # 'ฤ'
-        15: 3,  # 'ล'
-        12: 1,  # 'ว'
-        42: 0,  # 'ศ'
-        46: 0,  # 'ษ'
-        18: 0,  # 'ส'
-        21: 0,  # 'ห'
-        4: 0,  # 'อ'
-        63: 0,  # 'ฯ'
-        22: 0,  # 'ะ'
-        10: 0,  # 'ั'
-        1: 0,  # 'า'
-        36: 0,  # 'ำ'
-        23: 0,  # 'ิ'
-        13: 0,  # 'ี'
-        40: 0,  # 'ึ'
-        27: 0,  # 'ื'
-        32: 0,  # 'ุ'
-        35: 0,  # 'ู'
-        11: 1,  # 'เ'
-        28: 1,  # 'à¹'
-        41: 1,  # 'โ'
-        29: 0,  # 'ใ'
-        33: 0,  # 'ไ'
-        50: 0,  # 'ๆ'
-        37: 0,  # '็'
-        6: 3,  # '่'
-        7: 3,  # '้'
-        38: 0,  # '์'
-        56: 0,  # '๑'
-        59: 0,  # '๒'
-        60: 0,  # '๕'
-    },
-    11: {  # 'เ'
-        5: 3,  # 'à¸'
-        30: 3,  # 'ข'
-        24: 3,  # 'ค'
-        8: 2,  # 'ง'
-        26: 3,  # 'จ'
-        52: 3,  # 'ฉ'
-        34: 3,  # 'ช'
-        51: 2,  # 'ซ'
-        47: 0,  # 'à¸'
-        58: 0,  # 'ฎ'
-        57: 0,  # 'à¸'
-        49: 0,  # 'à¸'
-        53: 0,  # 'ฑ'
-        55: 0,  # 'ฒ'
-        43: 1,  # 'ณ'
-        20: 3,  # 'ด'
-        19: 3,  # 'ต'
-        44: 1,  # 'ถ'
-        14: 3,  # 'ท'
-        48: 1,  # 'ธ'
-        3: 3,  # 'น'
-        17: 3,  # 'บ'
-        25: 3,  # 'ป'
-        39: 2,  # 'ผ'
-        62: 1,  # 'à¸'
-        31: 3,  # 'พ'
-        54: 1,  # 'ฟ'
-        45: 3,  # 'ภ'
-        9: 3,  # 'ม'
-        16: 2,  # 'ย'
-        2: 3,  # 'ร'
-        61: 0,  # 'ฤ'
-        15: 3,  # 'ล'
-        12: 3,  # 'ว'
-        42: 2,  # 'ศ'
-        46: 0,  # 'ษ'
-        18: 3,  # 'ส'
-        21: 3,  # 'ห'
-        4: 3,  # 'อ'
-        63: 0,  # 'ฯ'
-        22: 0,  # 'ะ'
-        10: 0,  # 'ั'
-        1: 0,  # 'า'
-        36: 0,  # 'ำ'
-        23: 0,  # 'ิ'
-        13: 0,  # 'ี'
-        40: 0,  # 'ึ'
-        27: 0,  # 'ื'
-        32: 0,  # 'ุ'
-        35: 0,  # 'ู'
-        11: 0,  # 'เ'
-        28: 0,  # 'à¹'
-        41: 0,  # 'โ'
-        29: 0,  # 'ใ'
-        33: 0,  # 'ไ'
-        50: 0,  # 'ๆ'
-        37: 0,  # '็'
-        6: 0,  # '่'
-        7: 0,  # '้'
-        38: 0,  # '์'
-        56: 0,  # '๑'
-        59: 0,  # '๒'
-        60: 0,  # '๕'
-    },
-    28: {  # 'à¹'
-        5: 3,  # 'à¸'
-        30: 2,  # 'ข'
-        24: 2,  # 'ค'
-        8: 1,  # 'ง'
-        26: 2,  # 'จ'
-        52: 0,  # 'ฉ'
-        34: 1,  # 'ช'
-        51: 0,  # 'ซ'
-        47: 0,  # 'à¸'
-        58: 0,  # 'ฎ'
-        57: 0,  # 'à¸'
-        49: 0,  # 'à¸'
-        53: 0,  # 'ฑ'
-        55: 0,  # 'ฒ'
-        43: 0,  # 'ณ'
-        20: 2,  # 'ด'
-        19: 3,  # 'ต'
-        44: 2,  # 'ถ'
-        14: 3,  # 'ท'
-        48: 0,  # 'ธ'
-        3: 3,  # 'น'
-        17: 3,  # 'บ'
-        25: 2,  # 'ป'
-        39: 3,  # 'ผ'
-        62: 0,  # 'à¸'
-        31: 2,  # 'พ'
-        54: 2,  # 'ฟ'
-        45: 0,  # 'ภ'
-        9: 2,  # 'ม'
-        16: 2,  # 'ย'
-        2: 2,  # 'ร'
-        61: 0,  # 'ฤ'
-        15: 3,  # 'ล'
-        12: 2,  # 'ว'
-        42: 0,  # 'ศ'
-        46: 0,  # 'ษ'
-        18: 3,  # 'ส'
-        21: 3,  # 'ห'
-        4: 1,  # 'อ'
-        63: 0,  # 'ฯ'
-        22: 0,  # 'ะ'
-        10: 0,  # 'ั'
-        1: 0,  # 'า'
-        36: 0,  # 'ำ'
-        23: 0,  # 'ิ'
-        13: 0,  # 'ี'
-        40: 0,  # 'ึ'
-        27: 0,  # 'ื'
-        32: 0,  # 'ุ'
-        35: 0,  # 'ู'
-        11: 0,  # 'เ'
-        28: 0,  # 'à¹'
-        41: 0,  # 'โ'
-        29: 0,  # 'ใ'
-        33: 0,  # 'ไ'
-        50: 0,  # 'ๆ'
-        37: 0,  # '็'
-        6: 0,  # '่'
-        7: 0,  # '้'
-        38: 0,  # '์'
-        56: 0,  # '๑'
-        59: 0,  # '๒'
-        60: 0,  # '๕'
-    },
-    41: {  # 'โ'
-        5: 2,  # 'à¸'
-        30: 1,  # 'ข'
-        24: 2,  # 'ค'
-        8: 0,  # 'ง'
-        26: 1,  # 'จ'
-        52: 1,  # 'ฉ'
-        34: 1,  # 'ช'
-        51: 1,  # 'ซ'
-        47: 0,  # 'à¸'
-        58: 0,  # 'ฎ'
-        57: 0,  # 'à¸'
-        49: 0,  # 'à¸'
-        53: 0,  # 'ฑ'
-        55: 0,  # 'ฒ'
-        43: 0,  # 'ณ'
-        20: 3,  # 'ด'
-        19: 2,  # 'ต'
-        44: 0,  # 'ถ'
-        14: 2,  # 'ท'
-        48: 0,  # 'ธ'
-        3: 3,  # 'น'
-        17: 1,  # 'บ'
-        25: 3,  # 'ป'
-        39: 0,  # 'ผ'
-        62: 0,  # 'à¸'
-        31: 1,  # 'พ'
-        54: 1,  # 'ฟ'
-        45: 1,  # 'ภ'
-        9: 1,  # 'ม'
-        16: 2,  # 'ย'
-        2: 2,  # 'ร'
-        61: 0,  # 'ฤ'
-        15: 3,  # 'ล'
-        12: 0,  # 'ว'
-        42: 1,  # 'ศ'
-        46: 0,  # 'ษ'
-        18: 2,  # 'ส'
-        21: 0,  # 'ห'
-        4: 2,  # 'อ'
-        63: 0,  # 'ฯ'
-        22: 0,  # 'ะ'
-        10: 0,  # 'ั'
-        1: 0,  # 'า'
-        36: 0,  # 'ำ'
-        23: 0,  # 'ิ'
-        13: 0,  # 'ี'
-        40: 0,  # 'ึ'
-        27: 0,  # 'ื'
-        32: 0,  # 'ุ'
-        35: 0,  # 'ู'
-        11: 0,  # 'เ'
-        28: 0,  # 'à¹'
-        41: 0,  # 'โ'
-        29: 0,  # 'ใ'
-        33: 0,  # 'ไ'
-        50: 0,  # 'ๆ'
-        37: 0,  # '็'
-        6: 0,  # '่'
-        7: 0,  # '้'
-        38: 0,  # '์'
-        56: 0,  # '๑'
-        59: 0,  # '๒'
-        60: 0,  # '๕'
-    },
-    29: {  # 'ใ'
-        5: 2,  # 'à¸'
-        30: 0,  # 'ข'
-        24: 1,  # 'ค'
-        8: 0,  # 'ง'
-        26: 3,  # 'จ'
-        52: 0,  # 'ฉ'
-        34: 3,  # 'ช'
-        51: 0,  # 'ซ'
-        47: 0,  # 'à¸'
-        58: 0,  # 'ฎ'
-        57: 0,  # 'à¸'
-        49: 0,  # 'à¸'
-        53: 0,  # 'ฑ'
-        55: 0,  # 'ฒ'
-        43: 0,  # 'ณ'
-        20: 3,  # 'ด'
-        19: 1,  # 'ต'
-        44: 0,  # 'ถ'
-        14: 0,  # 'ท'
-        48: 0,  # 'ธ'
-        3: 3,  # 'น'
-        17: 2,  # 'บ'
-        25: 0,  # 'ป'
-        39: 0,  # 'ผ'
-        62: 0,  # 'à¸'
-        31: 0,  # 'พ'
-        54: 0,  # 'ฟ'
-        45: 0,  # 'ภ'
-        9: 0,  # 'ม'
-        16: 1,  # 'ย'
-        2: 0,  # 'ร'
-        61: 0,  # 'ฤ'
-        15: 0,  # 'ล'
-        12: 0,  # 'ว'
-        42: 0,  # 'ศ'
-        46: 0,  # 'ษ'
-        18: 3,  # 'ส'
-        21: 3,  # 'ห'
-        4: 0,  # 'อ'
-        63: 0,  # 'ฯ'
-        22: 0,  # 'ะ'
-        10: 0,  # 'ั'
-        1: 0,  # 'า'
-        36: 0,  # 'ำ'
-        23: 0,  # 'ิ'
-        13: 0,  # 'ี'
-        40: 0,  # 'ึ'
-        27: 0,  # 'ื'
-        32: 0,  # 'ุ'
-        35: 0,  # 'ู'
-        11: 0,  # 'เ'
-        28: 0,  # 'à¹'
-        41: 0,  # 'โ'
-        29: 0,  # 'ใ'
-        33: 0,  # 'ไ'
-        50: 0,  # 'ๆ'
-        37: 0,  # '็'
-        6: 0,  # '่'
-        7: 0,  # '้'
-        38: 0,  # '์'
-        56: 0,  # '๑'
-        59: 0,  # '๒'
-        60: 0,  # '๕'
-    },
-    33: {  # 'ไ'
-        5: 1,  # 'à¸'
-        30: 2,  # 'ข'
-        24: 0,  # 'ค'
-        8: 0,  # 'ง'
-        26: 0,  # 'จ'
-        52: 0,  # 'ฉ'
-        34: 1,  # 'ช'
-        51: 1,  # 'ซ'
-        47: 0,  # 'à¸'
-        58: 0,  # 'ฎ'
-        57: 0,  # 'à¸'
-        49: 0,  # 'à¸'
-        53: 0,  # 'ฑ'
-        55: 0,  # 'ฒ'
-        43: 0,  # 'ณ'
-        20: 3,  # 'ด'
-        19: 1,  # 'ต'
-        44: 0,  # 'ถ'
-        14: 3,  # 'ท'
-        48: 0,  # 'ธ'
-        3: 0,  # 'น'
-        17: 1,  # 'บ'
-        25: 3,  # 'ป'
-        39: 0,  # 'ผ'
-        62: 0,  # 'à¸'
-        31: 0,  # 'พ'
-        54: 2,  # 'ฟ'
-        45: 0,  # 'ภ'
-        9: 3,  # 'ม'
-        16: 0,  # 'ย'
-        2: 3,  # 'ร'
-        61: 0,  # 'ฤ'
-        15: 1,  # 'ล'
-        12: 3,  # 'ว'
-        42: 0,  # 'ศ'
-        46: 0,  # 'ษ'
-        18: 1,  # 'ส'
-        21: 2,  # 'ห'
-        4: 0,  # 'อ'
-        63: 0,  # 'ฯ'
-        22: 0,  # 'ะ'
-        10: 0,  # 'ั'
-        1: 0,  # 'า'
-        36: 0,  # 'ำ'
-        23: 0,  # 'ิ'
-        13: 0,  # 'ี'
-        40: 0,  # 'ึ'
-        27: 0,  # 'ื'
-        32: 0,  # 'ุ'
-        35: 0,  # 'ู'
-        11: 0,  # 'เ'
-        28: 0,  # 'à¹'
-        41: 0,  # 'โ'
-        29: 0,  # 'ใ'
-        33: 0,  # 'ไ'
-        50: 0,  # 'ๆ'
-        37: 0,  # '็'
-        6: 0,  # '่'
-        7: 0,  # '้'
-        38: 0,  # '์'
-        56: 0,  # '๑'
-        59: 0,  # '๒'
-        60: 0,  # '๕'
-    },
-    50: {  # 'ๆ'
-        5: 0,  # 'à¸'
-        30: 0,  # 'ข'
-        24: 0,  # 'ค'
-        8: 0,  # 'ง'
-        26: 0,  # 'จ'
-        52: 0,  # 'ฉ'
-        34: 0,  # 'ช'
-        51: 0,  # 'ซ'
-        47: 0,  # 'à¸'
-        58: 0,  # 'ฎ'
-        57: 0,  # 'à¸'
-        49: 0,  # 'à¸'
-        53: 0,  # 'ฑ'
-        55: 0,  # 'ฒ'
-        43: 0,  # 'ณ'
-        20: 0,  # 'ด'
-        19: 0,  # 'ต'
-        44: 0,  # 'ถ'
-        14: 0,  # 'ท'
-        48: 0,  # 'ธ'
-        3: 0,  # 'น'
-        17: 0,  # 'บ'
-        25: 0,  # 'ป'
-        39: 0,  # 'ผ'
-        62: 0,  # 'à¸'
-        31: 0,  # 'พ'
-        54: 0,  # 'ฟ'
-        45: 0,  # 'ภ'
-        9: 0,  # 'ม'
-        16: 0,  # 'ย'
-        2: 0,  # 'ร'
-        61: 0,  # 'ฤ'
-        15: 0,  # 'ล'
-        12: 0,  # 'ว'
-        42: 0,  # 'ศ'
-        46: 0,  # 'ษ'
-        18: 0,  # 'ส'
-        21: 0,  # 'ห'
-        4: 0,  # 'อ'
-        63: 0,  # 'ฯ'
-        22: 0,  # 'ะ'
-        10: 0,  # 'ั'
-        1: 0,  # 'า'
-        36: 0,  # 'ำ'
-        23: 0,  # 'ิ'
-        13: 0,  # 'ี'
-        40: 0,  # 'ึ'
-        27: 0,  # 'ื'
-        32: 0,  # 'ุ'
-        35: 0,  # 'ู'
-        11: 0,  # 'เ'
-        28: 0,  # 'à¹'
-        41: 0,  # 'โ'
-        29: 0,  # 'ใ'
-        33: 0,  # 'ไ'
-        50: 0,  # 'ๆ'
-        37: 0,  # '็'
-        6: 0,  # '่'
-        7: 0,  # '้'
-        38: 0,  # '์'
-        56: 0,  # '๑'
-        59: 0,  # '๒'
-        60: 0,  # '๕'
-    },
-    37: {  # '็'
-        5: 2,  # 'à¸'
-        30: 1,  # 'ข'
-        24: 2,  # 'ค'
-        8: 2,  # 'ง'
-        26: 3,  # 'จ'
-        52: 0,  # 'ฉ'
-        34: 0,  # 'ช'
-        51: 0,  # 'ซ'
-        47: 1,  # 'à¸'
-        58: 0,  # 'ฎ'
-        57: 0,  # 'à¸'
-        49: 0,  # 'à¸'
-        53: 0,  # 'ฑ'
-        55: 0,  # 'ฒ'
-        43: 0,  # 'ณ'
-        20: 1,  # 'ด'
-        19: 2,  # 'ต'
-        44: 0,  # 'ถ'
-        14: 1,  # 'ท'
-        48: 0,  # 'ธ'
-        3: 3,  # 'น'
-        17: 3,  # 'บ'
-        25: 0,  # 'ป'
-        39: 0,  # 'ผ'
-        62: 0,  # 'à¸'
-        31: 0,  # 'พ'
-        54: 0,  # 'ฟ'
-        45: 0,  # 'ภ'
-        9: 2,  # 'ม'
-        16: 1,  # 'ย'
-        2: 0,  # 'ร'
-        61: 0,  # 'ฤ'
-        15: 0,  # 'ล'
-        12: 2,  # 'ว'
-        42: 0,  # 'ศ'
-        46: 0,  # 'ษ'
-        18: 1,  # 'ส'
-        21: 0,  # 'ห'
-        4: 1,  # 'อ'
-        63: 0,  # 'ฯ'
-        22: 0,  # 'ะ'
-        10: 0,  # 'ั'
-        1: 0,  # 'า'
-        36: 0,  # 'ำ'
-        23: 0,  # 'ิ'
-        13: 0,  # 'ี'
-        40: 0,  # 'ึ'
-        27: 0,  # 'ื'
-        32: 0,  # 'ุ'
-        35: 0,  # 'ู'
-        11: 1,  # 'เ'
-        28: 0,  # 'à¹'
-        41: 0,  # 'โ'
-        29: 0,  # 'ใ'
-        33: 1,  # 'ไ'
-        50: 0,  # 'ๆ'
-        37: 0,  # '็'
-        6: 0,  # '่'
-        7: 0,  # '้'
-        38: 0,  # '์'
-        56: 0,  # '๑'
-        59: 0,  # '๒'
-        60: 0,  # '๕'
-    },
-    6: {  # '่'
-        5: 2,  # 'à¸'
-        30: 1,  # 'ข'
-        24: 2,  # 'ค'
-        8: 3,  # 'ง'
-        26: 2,  # 'จ'
-        52: 0,  # 'ฉ'
-        34: 1,  # 'ช'
-        51: 1,  # 'ซ'
-        47: 0,  # 'à¸'
-        58: 0,  # 'ฎ'
-        57: 0,  # 'à¸'
-        49: 1,  # 'à¸'
-        53: 0,  # 'ฑ'
-        55: 0,  # 'ฒ'
-        43: 0,  # 'ณ'
-        20: 1,  # 'ด'
-        19: 2,  # 'ต'
-        44: 1,  # 'ถ'
-        14: 2,  # 'ท'
-        48: 1,  # 'ธ'
-        3: 3,  # 'น'
-        17: 1,  # 'บ'
-        25: 2,  # 'ป'
-        39: 2,  # 'ผ'
-        62: 1,  # 'à¸'
-        31: 1,  # 'พ'
-        54: 0,  # 'ฟ'
-        45: 0,  # 'ภ'
-        9: 3,  # 'ม'
-        16: 3,  # 'ย'
-        2: 2,  # 'ร'
-        61: 0,  # 'ฤ'
-        15: 2,  # 'ล'
-        12: 3,  # 'ว'
-        42: 0,  # 'ศ'
-        46: 0,  # 'ษ'
-        18: 2,  # 'ส'
-        21: 1,  # 'ห'
-        4: 3,  # 'อ'
-        63: 0,  # 'ฯ'
-        22: 1,  # 'ะ'
-        10: 0,  # 'ั'
-        1: 3,  # 'า'
-        36: 2,  # 'ำ'
-        23: 0,  # 'ิ'
-        13: 0,  # 'ี'
-        40: 0,  # 'ึ'
-        27: 0,  # 'ื'
-        32: 0,  # 'ุ'
-        35: 0,  # 'ู'
-        11: 3,  # 'เ'
-        28: 2,  # 'à¹'
-        41: 1,  # 'โ'
-        29: 2,  # 'ใ'
-        33: 2,  # 'ไ'
-        50: 1,  # 'ๆ'
-        37: 0,  # '็'
-        6: 0,  # '่'
-        7: 0,  # '้'
-        38: 0,  # '์'
-        56: 0,  # '๑'
-        59: 0,  # '๒'
-        60: 0,  # '๕'
-    },
-    7: {  # '้'
-        5: 2,  # 'à¸'
-        30: 1,  # 'ข'
-        24: 2,  # 'ค'
-        8: 3,  # 'ง'
-        26: 2,  # 'จ'
-        52: 0,  # 'ฉ'
-        34: 1,  # 'ช'
-        51: 1,  # 'ซ'
-        47: 0,  # 'à¸'
-        58: 0,  # 'ฎ'
-        57: 0,  # 'à¸'
-        49: 0,  # 'à¸'
-        53: 0,  # 'ฑ'
-        55: 0,  # 'ฒ'
-        43: 0,  # 'ณ'
-        20: 1,  # 'ด'
-        19: 2,  # 'ต'
-        44: 1,  # 'ถ'
-        14: 2,  # 'ท'
-        48: 0,  # 'ธ'
-        3: 3,  # 'น'
-        17: 2,  # 'บ'
-        25: 2,  # 'ป'
-        39: 2,  # 'ผ'
-        62: 0,  # 'à¸'
-        31: 1,  # 'พ'
-        54: 1,  # 'ฟ'
-        45: 0,  # 'ภ'
-        9: 3,  # 'ม'
-        16: 2,  # 'ย'
-        2: 2,  # 'ร'
-        61: 0,  # 'ฤ'
-        15: 1,  # 'ล'
-        12: 3,  # 'ว'
-        42: 1,  # 'ศ'
-        46: 0,  # 'ษ'
-        18: 2,  # 'ส'
-        21: 2,  # 'ห'
-        4: 3,  # 'อ'
-        63: 0,  # 'ฯ'
-        22: 0,  # 'ะ'
-        10: 0,  # 'ั'
-        1: 3,  # 'า'
-        36: 2,  # 'ำ'
-        23: 0,  # 'ิ'
-        13: 0,  # 'ี'
-        40: 0,  # 'ึ'
-        27: 0,  # 'ื'
-        32: 0,  # 'ุ'
-        35: 0,  # 'ู'
-        11: 2,  # 'เ'
-        28: 2,  # 'à¹'
-        41: 1,  # 'โ'
-        29: 2,  # 'ใ'
-        33: 2,  # 'ไ'
-        50: 0,  # 'ๆ'
-        37: 0,  # '็'
-        6: 0,  # '่'
-        7: 0,  # '้'
-        38: 0,  # '์'
-        56: 0,  # '๑'
-        59: 0,  # '๒'
-        60: 0,  # '๕'
-    },
-    38: {  # '์'
-        5: 2,  # 'à¸'
-        30: 1,  # 'ข'
-        24: 1,  # 'ค'
-        8: 0,  # 'ง'
-        26: 1,  # 'จ'
-        52: 0,  # 'ฉ'
-        34: 1,  # 'ช'
-        51: 0,  # 'ซ'
-        47: 0,  # 'à¸'
-        58: 0,  # 'ฎ'
-        57: 0,  # 'à¸'
-        49: 0,  # 'à¸'
-        53: 0,  # 'ฑ'
-        55: 0,  # 'ฒ'
-        43: 0,  # 'ณ'
-        20: 2,  # 'ด'
-        19: 1,  # 'ต'
-        44: 1,  # 'ถ'
-        14: 1,  # 'ท'
-        48: 0,  # 'ธ'
-        3: 1,  # 'น'
-        17: 1,  # 'บ'
-        25: 1,  # 'ป'
-        39: 0,  # 'ผ'
-        62: 0,  # 'à¸'
-        31: 1,  # 'พ'
-        54: 1,  # 'ฟ'
-        45: 0,  # 'ภ'
-        9: 2,  # 'ม'
-        16: 0,  # 'ย'
-        2: 1,  # 'ร'
-        61: 1,  # 'ฤ'
-        15: 1,  # 'ล'
-        12: 1,  # 'ว'
-        42: 0,  # 'ศ'
-        46: 0,  # 'ษ'
-        18: 1,  # 'ส'
-        21: 1,  # 'ห'
-        4: 2,  # 'อ'
-        63: 1,  # 'ฯ'
-        22: 0,  # 'ะ'
-        10: 0,  # 'ั'
-        1: 0,  # 'า'
-        36: 0,  # 'ำ'
-        23: 0,  # 'ิ'
-        13: 0,  # 'ี'
-        40: 0,  # 'ึ'
-        27: 0,  # 'ื'
-        32: 0,  # 'ุ'
-        35: 0,  # 'ู'
-        11: 2,  # 'เ'
-        28: 2,  # 'à¹'
-        41: 1,  # 'โ'
-        29: 1,  # 'ใ'
-        33: 1,  # 'ไ'
-        50: 0,  # 'ๆ'
-        37: 0,  # '็'
-        6: 0,  # '่'
-        7: 0,  # '้'
-        38: 0,  # '์'
-        56: 0,  # '๑'
-        59: 0,  # '๒'
-        60: 0,  # '๕'
-    },
-    56: {  # '๑'
-        5: 0,  # 'à¸'
-        30: 0,  # 'ข'
-        24: 0,  # 'ค'
-        8: 0,  # 'ง'
-        26: 0,  # 'จ'
-        52: 0,  # 'ฉ'
-        34: 0,  # 'ช'
-        51: 0,  # 'ซ'
-        47: 0,  # 'à¸'
-        58: 0,  # 'ฎ'
-        57: 0,  # 'à¸'
-        49: 0,  # 'à¸'
-        53: 0,  # 'ฑ'
-        55: 0,  # 'ฒ'
-        43: 0,  # 'ณ'
-        20: 0,  # 'ด'
-        19: 0,  # 'ต'
-        44: 0,  # 'ถ'
-        14: 0,  # 'ท'
-        48: 0,  # 'ธ'
-        3: 0,  # 'น'
-        17: 0,  # 'บ'
-        25: 0,  # 'ป'
-        39: 0,  # 'ผ'
-        62: 0,  # 'à¸'
-        31: 0,  # 'พ'
-        54: 0,  # 'ฟ'
-        45: 0,  # 'ภ'
-        9: 0,  # 'ม'
-        16: 0,  # 'ย'
-        2: 0,  # 'ร'
-        61: 0,  # 'ฤ'
-        15: 0,  # 'ล'
-        12: 0,  # 'ว'
-        42: 0,  # 'ศ'
-        46: 0,  # 'ษ'
-        18: 0,  # 'ส'
-        21: 0,  # 'ห'
-        4: 0,  # 'อ'
-        63: 0,  # 'ฯ'
-        22: 0,  # 'ะ'
-        10: 0,  # 'ั'
-        1: 0,  # 'า'
-        36: 0,  # 'ำ'
-        23: 0,  # 'ิ'
-        13: 0,  # 'ี'
-        40: 0,  # 'ึ'
-        27: 0,  # 'ื'
-        32: 0,  # 'ุ'
-        35: 0,  # 'ู'
-        11: 0,  # 'เ'
-        28: 0,  # 'à¹'
-        41: 0,  # 'โ'
-        29: 0,  # 'ใ'
-        33: 0,  # 'ไ'
-        50: 0,  # 'ๆ'
-        37: 0,  # '็'
-        6: 0,  # '่'
-        7: 0,  # '้'
-        38: 0,  # '์'
-        56: 2,  # '๑'
-        59: 1,  # '๒'
-        60: 1,  # '๕'
-    },
-    59: {  # '๒'
-        5: 0,  # 'à¸'
-        30: 0,  # 'ข'
-        24: 0,  # 'ค'
-        8: 0,  # 'ง'
-        26: 0,  # 'จ'
-        52: 0,  # 'ฉ'
-        34: 0,  # 'ช'
-        51: 0,  # 'ซ'
-        47: 0,  # 'à¸'
-        58: 0,  # 'ฎ'
-        57: 0,  # 'à¸'
-        49: 0,  # 'à¸'
-        53: 0,  # 'ฑ'
-        55: 0,  # 'ฒ'
-        43: 0,  # 'ณ'
-        20: 0,  # 'ด'
-        19: 0,  # 'ต'
-        44: 0,  # 'ถ'
-        14: 0,  # 'ท'
-        48: 0,  # 'ธ'
-        3: 0,  # 'น'
-        17: 0,  # 'บ'
-        25: 0,  # 'ป'
-        39: 0,  # 'ผ'
-        62: 0,  # 'à¸'
-        31: 0,  # 'พ'
-        54: 0,  # 'ฟ'
-        45: 0,  # 'ภ'
-        9: 0,  # 'ม'
-        16: 0,  # 'ย'
-        2: 0,  # 'ร'
-        61: 0,  # 'ฤ'
-        15: 0,  # 'ล'
-        12: 0,  # 'ว'
-        42: 0,  # 'ศ'
-        46: 0,  # 'ษ'
-        18: 0,  # 'ส'
-        21: 0,  # 'ห'
-        4: 0,  # 'อ'
-        63: 0,  # 'ฯ'
-        22: 0,  # 'ะ'
-        10: 0,  # 'ั'
-        1: 0,  # 'า'
-        36: 0,  # 'ำ'
-        23: 0,  # 'ิ'
-        13: 0,  # 'ี'
-        40: 0,  # 'ึ'
-        27: 0,  # 'ื'
-        32: 0,  # 'ุ'
-        35: 0,  # 'ู'
-        11: 0,  # 'เ'
-        28: 0,  # 'à¹'
-        41: 0,  # 'โ'
-        29: 0,  # 'ใ'
-        33: 0,  # 'ไ'
-        50: 0,  # 'ๆ'
-        37: 0,  # '็'
-        6: 0,  # '่'
-        7: 0,  # '้'
-        38: 0,  # '์'
-        56: 1,  # '๑'
-        59: 1,  # '๒'
-        60: 3,  # '๕'
-    },
-    60: {  # '๕'
-        5: 0,  # 'à¸'
-        30: 0,  # 'ข'
-        24: 0,  # 'ค'
-        8: 0,  # 'ง'
-        26: 0,  # 'จ'
-        52: 0,  # 'ฉ'
-        34: 0,  # 'ช'
-        51: 0,  # 'ซ'
-        47: 0,  # 'à¸'
-        58: 0,  # 'ฎ'
-        57: 0,  # 'à¸'
-        49: 0,  # 'à¸'
-        53: 0,  # 'ฑ'
-        55: 0,  # 'ฒ'
-        43: 0,  # 'ณ'
-        20: 0,  # 'ด'
-        19: 0,  # 'ต'
-        44: 0,  # 'ถ'
-        14: 0,  # 'ท'
-        48: 0,  # 'ธ'
-        3: 0,  # 'น'
-        17: 0,  # 'บ'
-        25: 0,  # 'ป'
-        39: 0,  # 'ผ'
-        62: 0,  # 'à¸'
-        31: 0,  # 'พ'
-        54: 0,  # 'ฟ'
-        45: 0,  # 'ภ'
-        9: 0,  # 'ม'
-        16: 0,  # 'ย'
-        2: 0,  # 'ร'
-        61: 0,  # 'ฤ'
-        15: 0,  # 'ล'
-        12: 0,  # 'ว'
-        42: 0,  # 'ศ'
-        46: 0,  # 'ษ'
-        18: 0,  # 'ส'
-        21: 0,  # 'ห'
-        4: 0,  # 'อ'
-        63: 0,  # 'ฯ'
-        22: 0,  # 'ะ'
-        10: 0,  # 'ั'
-        1: 0,  # 'า'
-        36: 0,  # 'ำ'
-        23: 0,  # 'ิ'
-        13: 0,  # 'ี'
-        40: 0,  # 'ึ'
-        27: 0,  # 'ื'
-        32: 0,  # 'ุ'
-        35: 0,  # 'ู'
-        11: 0,  # 'เ'
-        28: 0,  # 'à¹'
-        41: 0,  # 'โ'
-        29: 0,  # 'ใ'
-        33: 0,  # 'ไ'
-        50: 0,  # 'ๆ'
-        37: 0,  # '็'
-        6: 0,  # '่'
-        7: 0,  # '้'
-        38: 0,  # '์'
-        56: 2,  # '๑'
-        59: 1,  # '๒'
-        60: 0,  # '๕'
-    },
-}
-
-# 255: Undefined characters that did not exist in training text
-# 254: Carriage/Return
-# 253: symbol (punctuation) that does not belong to word
-# 252: 0 - 9
-# 251: Control characters
-
-# Character Mapping Table(s):
-TIS_620_THAI_CHAR_TO_ORDER = {
-     0: 255,  # '\x00'
-     1: 255,  # '\x01'
-     2: 255,  # '\x02'
-     3: 255,  # '\x03'
-     4: 255,  # '\x04'
-     5: 255,  # '\x05'
-     6: 255,  # '\x06'
-     7: 255,  # '\x07'
-     8: 255,  # '\x08'
-     9: 255,  # '\t'
-     10: 254,  # '\n'
-     11: 255,  # '\x0b'
-     12: 255,  # '\x0c'
-     13: 254,  # '\r'
-     14: 255,  # '\x0e'
-     15: 255,  # '\x0f'
-     16: 255,  # '\x10'
-     17: 255,  # '\x11'
-     18: 255,  # '\x12'
-     19: 255,  # '\x13'
-     20: 255,  # '\x14'
-     21: 255,  # '\x15'
-     22: 255,  # '\x16'
-     23: 255,  # '\x17'
-     24: 255,  # '\x18'
-     25: 255,  # '\x19'
-     26: 255,  # '\x1a'
-     27: 255,  # '\x1b'
-     28: 255,  # '\x1c'
-     29: 255,  # '\x1d'
-     30: 255,  # '\x1e'
-     31: 255,  # '\x1f'
-     32: 253,  # ' '
-     33: 253,  # '!'
-     34: 253,  # '"'
-     35: 253,  # '#'
-     36: 253,  # '$'
-     37: 253,  # '%'
-     38: 253,  # '&'
-     39: 253,  # "'"
-     40: 253,  # '('
-     41: 253,  # ')'
-     42: 253,  # '*'
-     43: 253,  # '+'
-     44: 253,  # ','
-     45: 253,  # '-'
-     46: 253,  # '.'
-     47: 253,  # '/'
-     48: 252,  # '0'
-     49: 252,  # '1'
-     50: 252,  # '2'
-     51: 252,  # '3'
-     52: 252,  # '4'
-     53: 252,  # '5'
-     54: 252,  # '6'
-     55: 252,  # '7'
-     56: 252,  # '8'
-     57: 252,  # '9'
-     58: 253,  # ':'
-     59: 253,  # ';'
-     60: 253,  # '<'
-     61: 253,  # '='
-     62: 253,  # '>'
-     63: 253,  # '?'
-     64: 253,  # '@'
-     65: 182,  # 'A'
-     66: 106,  # 'B'
-     67: 107,  # 'C'
-     68: 100,  # 'D'
-     69: 183,  # 'E'
-     70: 184,  # 'F'
-     71: 185,  # 'G'
-     72: 101,  # 'H'
-     73: 94,  # 'I'
-     74: 186,  # 'J'
-     75: 187,  # 'K'
-     76: 108,  # 'L'
-     77: 109,  # 'M'
-     78: 110,  # 'N'
-     79: 111,  # 'O'
-     80: 188,  # 'P'
-     81: 189,  # 'Q'
-     82: 190,  # 'R'
-     83: 89,  # 'S'
-     84: 95,  # 'T'
-     85: 112,  # 'U'
-     86: 113,  # 'V'
-     87: 191,  # 'W'
-     88: 192,  # 'X'
-     89: 193,  # 'Y'
-     90: 194,  # 'Z'
-     91: 253,  # '['
-     92: 253,  # '\\'
-     93: 253,  # ']'
-     94: 253,  # '^'
-     95: 253,  # '_'
-     96: 253,  # '`'
-     97: 64,  # 'a'
-     98: 72,  # 'b'
-     99: 73,  # 'c'
-     100: 114,  # 'd'
-     101: 74,  # 'e'
-     102: 115,  # 'f'
-     103: 116,  # 'g'
-     104: 102,  # 'h'
-     105: 81,  # 'i'
-     106: 201,  # 'j'
-     107: 117,  # 'k'
-     108: 90,  # 'l'
-     109: 103,  # 'm'
-     110: 78,  # 'n'
-     111: 82,  # 'o'
-     112: 96,  # 'p'
-     113: 202,  # 'q'
-     114: 91,  # 'r'
-     115: 79,  # 's'
-     116: 84,  # 't'
-     117: 104,  # 'u'
-     118: 105,  # 'v'
-     119: 97,  # 'w'
-     120: 98,  # 'x'
-     121: 92,  # 'y'
-     122: 203,  # 'z'
-     123: 253,  # '{'
-     124: 253,  # '|'
-     125: 253,  # '}'
-     126: 253,  # '~'
-     127: 253,  # '\x7f'
-     128: 209,  # '\x80'
-     129: 210,  # '\x81'
-     130: 211,  # '\x82'
-     131: 212,  # '\x83'
-     132: 213,  # '\x84'
-     133: 88,  # '\x85'
-     134: 214,  # '\x86'
-     135: 215,  # '\x87'
-     136: 216,  # '\x88'
-     137: 217,  # '\x89'
-     138: 218,  # '\x8a'
-     139: 219,  # '\x8b'
-     140: 220,  # '\x8c'
-     141: 118,  # '\x8d'
-     142: 221,  # '\x8e'
-     143: 222,  # '\x8f'
-     144: 223,  # '\x90'
-     145: 224,  # '\x91'
-     146: 99,  # '\x92'
-     147: 85,  # '\x93'
-     148: 83,  # '\x94'
-     149: 225,  # '\x95'
-     150: 226,  # '\x96'
-     151: 227,  # '\x97'
-     152: 228,  # '\x98'
-     153: 229,  # '\x99'
-     154: 230,  # '\x9a'
-     155: 231,  # '\x9b'
-     156: 232,  # '\x9c'
-     157: 233,  # '\x9d'
-     158: 234,  # '\x9e'
-     159: 235,  # '\x9f'
-     160: 236,  # None
-     161: 5,  # 'à¸'
-     162: 30,  # 'ข'
-     163: 237,  # 'ฃ'
-     164: 24,  # 'ค'
-     165: 238,  # 'ฅ'
-     166: 75,  # 'ฆ'
-     167: 8,  # 'ง'
-     168: 26,  # 'จ'
-     169: 52,  # 'ฉ'
-     170: 34,  # 'ช'
-     171: 51,  # 'ซ'
-     172: 119,  # 'ฌ'
-     173: 47,  # 'à¸'
-     174: 58,  # 'ฎ'
-     175: 57,  # 'à¸'
-     176: 49,  # 'à¸'
-     177: 53,  # 'ฑ'
-     178: 55,  # 'ฒ'
-     179: 43,  # 'ณ'
-     180: 20,  # 'ด'
-     181: 19,  # 'ต'
-     182: 44,  # 'ถ'
-     183: 14,  # 'ท'
-     184: 48,  # 'ธ'
-     185: 3,  # 'น'
-     186: 17,  # 'บ'
-     187: 25,  # 'ป'
-     188: 39,  # 'ผ'
-     189: 62,  # 'à¸'
-     190: 31,  # 'พ'
-     191: 54,  # 'ฟ'
-     192: 45,  # 'ภ'
-     193: 9,  # 'ม'
-     194: 16,  # 'ย'
-     195: 2,  # 'ร'
-     196: 61,  # 'ฤ'
-     197: 15,  # 'ล'
-     198: 239,  # 'ฦ'
-     199: 12,  # 'ว'
-     200: 42,  # 'ศ'
-     201: 46,  # 'ษ'
-     202: 18,  # 'ส'
-     203: 21,  # 'ห'
-     204: 76,  # 'ฬ'
-     205: 4,  # 'อ'
-     206: 66,  # 'ฮ'
-     207: 63,  # 'ฯ'
-     208: 22,  # 'ะ'
-     209: 10,  # 'ั'
-     210: 1,  # 'า'
-     211: 36,  # 'ำ'
-     212: 23,  # 'ิ'
-     213: 13,  # 'ี'
-     214: 40,  # 'ึ'
-     215: 27,  # 'ื'
-     216: 32,  # 'ุ'
-     217: 35,  # 'ู'
-     218: 86,  # 'ฺ'
-     219: 240,  # None
-     220: 241,  # None
-     221: 242,  # None
-     222: 243,  # None
-     223: 244,  # '฿'
-     224: 11,  # 'เ'
-     225: 28,  # 'à¹'
-     226: 41,  # 'โ'
-     227: 29,  # 'ใ'
-     228: 33,  # 'ไ'
-     229: 245,  # 'ๅ'
-     230: 50,  # 'ๆ'
-     231: 37,  # '็'
-     232: 6,  # '่'
-     233: 7,  # '้'
-     234: 67,  # '๊'
-     235: 77,  # '๋'
-     236: 38,  # '์'
-     237: 93,  # 'à¹'
-     238: 246,  # '๎'
-     239: 247,  # 'à¹'
-     240: 68,  # 'à¹'
-     241: 56,  # '๑'
-     242: 59,  # '๒'
-     243: 65,  # '๓'
-     244: 69,  # '๔'
-     245: 60,  # '๕'
-     246: 70,  # '๖'
-     247: 80,  # '๗'
-     248: 71,  # '๘'
-     249: 87,  # '๙'
-     250: 248,  # '๚'
-     251: 249,  # '๛'
-     252: 250,  # None
-     253: 251,  # None
-     254: 252,  # None
-     255: 253,  # None
-}
-
-TIS_620_THAI_MODEL = SingleByteCharSetModel(charset_name='TIS-620',
-                                            language='Thai',
-                                            char_to_order_map=TIS_620_THAI_CHAR_TO_ORDER,
-                                            language_model=THAI_LANG_MODEL,
-                                            typical_positive_ratio=0.926386,
-                                            keep_ascii_letters=False,
-                                            alphabet='à¸à¸‚ฃคฅฆงจฉชซฌà¸à¸Žà¸à¸à¸‘ฒณดตถทธนบปผà¸à¸žà¸Ÿà¸ à¸¡à¸¢à¸£à¸¤à¸¥à¸¦à¸§à¸¨à¸©à¸ªà¸«à¸¬à¸­à¸®à¸¯à¸°à¸±à¸²à¸³à¸´à¸µà¸¶à¸·à¸¸à¸¹à¸ºà¸¿à¹€à¹à¹‚ใไๅๆ็่้๊๋์à¹à¹Žà¹à¹à¹‘๒๓๔๕๖๗๘๙๚๛')
-
diff --git a/lib/sub_repos/chardet/chardet/langturkishmodel.py b/lib/sub_repos/chardet/chardet/langturkishmodel.py
deleted file mode 100644
index 8ba93224d..000000000
--- a/lib/sub_repos/chardet/chardet/langturkishmodel.py
+++ /dev/null
@@ -1,4383 +0,0 @@
-#!/usr/bin/env python
-# -*- coding: utf-8 -*-
-
-from chardet.sbcharsetprober import SingleByteCharSetModel
-
-
-# 3: Positive
-# 2: Likely
-# 1: Unlikely
-# 0: Negative
-
-TURKISH_LANG_MODEL = {
-    23: {  # 'A'
-        23: 0,  # 'A'
-        37: 0,  # 'B'
-        47: 0,  # 'C'
-        39: 0,  # 'D'
-        29: 0,  # 'E'
-        52: 0,  # 'F'
-        36: 0,  # 'G'
-        45: 0,  # 'H'
-        53: 0,  # 'I'
-        60: 0,  # 'J'
-        16: 0,  # 'K'
-        49: 0,  # 'L'
-        20: 0,  # 'M'
-        46: 0,  # 'N'
-        42: 0,  # 'O'
-        48: 0,  # 'P'
-        44: 0,  # 'R'
-        35: 0,  # 'S'
-        31: 0,  # 'T'
-        51: 0,  # 'U'
-        38: 0,  # 'V'
-        62: 0,  # 'W'
-        43: 0,  # 'Y'
-        56: 0,  # 'Z'
-        1: 3,  # 'a'
-        21: 0,  # 'b'
-        28: 0,  # 'c'
-        12: 2,  # 'd'
-        2: 3,  # 'e'
-        18: 0,  # 'f'
-        27: 1,  # 'g'
-        25: 1,  # 'h'
-        3: 1,  # 'i'
-        24: 0,  # 'j'
-        10: 2,  # 'k'
-        5: 1,  # 'l'
-        13: 1,  # 'm'
-        4: 1,  # 'n'
-        15: 0,  # 'o'
-        26: 0,  # 'p'
-        7: 1,  # 'r'
-        8: 1,  # 's'
-        9: 1,  # 't'
-        14: 1,  # 'u'
-        32: 0,  # 'v'
-        57: 0,  # 'w'
-        58: 0,  # 'x'
-        11: 3,  # 'y'
-        22: 0,  # 'z'
-        63: 0,  # '·'
-        54: 0,  # 'Ç'
-        50: 0,  # 'Ö'
-        55: 0,  # 'Ü'
-        59: 0,  # 'â'
-        33: 1,  # 'ç'
-        61: 0,  # 'î'
-        34: 0,  # 'ö'
-        17: 0,  # 'ü'
-        30: 0,  # 'ÄŸ'
-        41: 0,  # 'İ'
-        6: 0,  # 'ı'
-        40: 0,  # 'Åž'
-        19: 0,  # 'ÅŸ'
-    },
-    37: {  # 'B'
-        23: 0,  # 'A'
-        37: 0,  # 'B'
-        47: 2,  # 'C'
-        39: 0,  # 'D'
-        29: 0,  # 'E'
-        52: 2,  # 'F'
-        36: 0,  # 'G'
-        45: 0,  # 'H'
-        53: 0,  # 'I'
-        60: 0,  # 'J'
-        16: 1,  # 'K'
-        49: 0,  # 'L'
-        20: 0,  # 'M'
-        46: 0,  # 'N'
-        42: 0,  # 'O'
-        48: 1,  # 'P'
-        44: 0,  # 'R'
-        35: 1,  # 'S'
-        31: 0,  # 'T'
-        51: 0,  # 'U'
-        38: 1,  # 'V'
-        62: 0,  # 'W'
-        43: 1,  # 'Y'
-        56: 0,  # 'Z'
-        1: 2,  # 'a'
-        21: 0,  # 'b'
-        28: 2,  # 'c'
-        12: 0,  # 'd'
-        2: 3,  # 'e'
-        18: 0,  # 'f'
-        27: 0,  # 'g'
-        25: 0,  # 'h'
-        3: 0,  # 'i'
-        24: 0,  # 'j'
-        10: 0,  # 'k'
-        5: 0,  # 'l'
-        13: 1,  # 'm'
-        4: 1,  # 'n'
-        15: 0,  # 'o'
-        26: 0,  # 'p'
-        7: 0,  # 'r'
-        8: 0,  # 's'
-        9: 0,  # 't'
-        14: 2,  # 'u'
-        32: 0,  # 'v'
-        57: 0,  # 'w'
-        58: 0,  # 'x'
-        11: 0,  # 'y'
-        22: 1,  # 'z'
-        63: 0,  # '·'
-        54: 0,  # 'Ç'
-        50: 1,  # 'Ö'
-        55: 0,  # 'Ü'
-        59: 0,  # 'â'
-        33: 0,  # 'ç'
-        61: 0,  # 'î'
-        34: 1,  # 'ö'
-        17: 0,  # 'ü'
-        30: 0,  # 'ÄŸ'
-        41: 0,  # 'İ'
-        6: 0,  # 'ı'
-        40: 1,  # 'Åž'
-        19: 1,  # 'ÅŸ'
-    },
-    47: {  # 'C'
-        23: 0,  # 'A'
-        37: 0,  # 'B'
-        47: 0,  # 'C'
-        39: 0,  # 'D'
-        29: 0,  # 'E'
-        52: 1,  # 'F'
-        36: 0,  # 'G'
-        45: 0,  # 'H'
-        53: 0,  # 'I'
-        60: 0,  # 'J'
-        16: 0,  # 'K'
-        49: 1,  # 'L'
-        20: 0,  # 'M'
-        46: 1,  # 'N'
-        42: 0,  # 'O'
-        48: 1,  # 'P'
-        44: 1,  # 'R'
-        35: 0,  # 'S'
-        31: 0,  # 'T'
-        51: 0,  # 'U'
-        38: 1,  # 'V'
-        62: 0,  # 'W'
-        43: 1,  # 'Y'
-        56: 0,  # 'Z'
-        1: 3,  # 'a'
-        21: 0,  # 'b'
-        28: 2,  # 'c'
-        12: 0,  # 'd'
-        2: 3,  # 'e'
-        18: 0,  # 'f'
-        27: 0,  # 'g'
-        25: 0,  # 'h'
-        3: 0,  # 'i'
-        24: 2,  # 'j'
-        10: 1,  # 'k'
-        5: 2,  # 'l'
-        13: 2,  # 'm'
-        4: 2,  # 'n'
-        15: 1,  # 'o'
-        26: 0,  # 'p'
-        7: 2,  # 'r'
-        8: 0,  # 's'
-        9: 0,  # 't'
-        14: 3,  # 'u'
-        32: 0,  # 'v'
-        57: 0,  # 'w'
-        58: 0,  # 'x'
-        11: 0,  # 'y'
-        22: 2,  # 'z'
-        63: 0,  # '·'
-        54: 0,  # 'Ç'
-        50: 1,  # 'Ö'
-        55: 0,  # 'Ü'
-        59: 0,  # 'â'
-        33: 1,  # 'ç'
-        61: 0,  # 'î'
-        34: 1,  # 'ö'
-        17: 0,  # 'ü'
-        30: 0,  # 'ÄŸ'
-        41: 1,  # 'İ'
-        6: 3,  # 'ı'
-        40: 0,  # 'Åž'
-        19: 0,  # 'ÅŸ'
-    },
-    39: {  # 'D'
-        23: 0,  # 'A'
-        37: 0,  # 'B'
-        47: 0,  # 'C'
-        39: 0,  # 'D'
-        29: 0,  # 'E'
-        52: 1,  # 'F'
-        36: 0,  # 'G'
-        45: 0,  # 'H'
-        53: 0,  # 'I'
-        60: 0,  # 'J'
-        16: 1,  # 'K'
-        49: 0,  # 'L'
-        20: 0,  # 'M'
-        46: 0,  # 'N'
-        42: 0,  # 'O'
-        48: 1,  # 'P'
-        44: 0,  # 'R'
-        35: 0,  # 'S'
-        31: 0,  # 'T'
-        51: 0,  # 'U'
-        38: 0,  # 'V'
-        62: 0,  # 'W'
-        43: 0,  # 'Y'
-        56: 0,  # 'Z'
-        1: 2,  # 'a'
-        21: 0,  # 'b'
-        28: 2,  # 'c'
-        12: 0,  # 'd'
-        2: 2,  # 'e'
-        18: 0,  # 'f'
-        27: 0,  # 'g'
-        25: 0,  # 'h'
-        3: 0,  # 'i'
-        24: 0,  # 'j'
-        10: 0,  # 'k'
-        5: 1,  # 'l'
-        13: 3,  # 'm'
-        4: 0,  # 'n'
-        15: 1,  # 'o'
-        26: 0,  # 'p'
-        7: 0,  # 'r'
-        8: 0,  # 's'
-        9: 0,  # 't'
-        14: 1,  # 'u'
-        32: 0,  # 'v'
-        57: 0,  # 'w'
-        58: 0,  # 'x'
-        11: 0,  # 'y'
-        22: 1,  # 'z'
-        63: 0,  # '·'
-        54: 1,  # 'Ç'
-        50: 0,  # 'Ö'
-        55: 0,  # 'Ü'
-        59: 0,  # 'â'
-        33: 1,  # 'ç'
-        61: 0,  # 'î'
-        34: 0,  # 'ö'
-        17: 0,  # 'ü'
-        30: 1,  # 'ÄŸ'
-        41: 0,  # 'İ'
-        6: 1,  # 'ı'
-        40: 1,  # 'Åž'
-        19: 0,  # 'ÅŸ'
-    },
-    29: {  # 'E'
-        23: 0,  # 'A'
-        37: 0,  # 'B'
-        47: 0,  # 'C'
-        39: 0,  # 'D'
-        29: 1,  # 'E'
-        52: 0,  # 'F'
-        36: 0,  # 'G'
-        45: 0,  # 'H'
-        53: 0,  # 'I'
-        60: 0,  # 'J'
-        16: 3,  # 'K'
-        49: 0,  # 'L'
-        20: 1,  # 'M'
-        46: 0,  # 'N'
-        42: 0,  # 'O'
-        48: 0,  # 'P'
-        44: 0,  # 'R'
-        35: 0,  # 'S'
-        31: 0,  # 'T'
-        51: 0,  # 'U'
-        38: 0,  # 'V'
-        62: 0,  # 'W'
-        43: 0,  # 'Y'
-        56: 0,  # 'Z'
-        1: 3,  # 'a'
-        21: 0,  # 'b'
-        28: 0,  # 'c'
-        12: 2,  # 'd'
-        2: 3,  # 'e'
-        18: 0,  # 'f'
-        27: 1,  # 'g'
-        25: 0,  # 'h'
-        3: 1,  # 'i'
-        24: 1,  # 'j'
-        10: 0,  # 'k'
-        5: 3,  # 'l'
-        13: 3,  # 'm'
-        4: 3,  # 'n'
-        15: 0,  # 'o'
-        26: 0,  # 'p'
-        7: 0,  # 'r'
-        8: 1,  # 's'
-        9: 1,  # 't'
-        14: 1,  # 'u'
-        32: 1,  # 'v'
-        57: 0,  # 'w'
-        58: 0,  # 'x'
-        11: 2,  # 'y'
-        22: 0,  # 'z'
-        63: 0,  # '·'
-        54: 0,  # 'Ç'
-        50: 0,  # 'Ö'
-        55: 0,  # 'Ü'
-        59: 0,  # 'â'
-        33: 0,  # 'ç'
-        61: 0,  # 'î'
-        34: 0,  # 'ö'
-        17: 0,  # 'ü'
-        30: 0,  # 'ÄŸ'
-        41: 0,  # 'İ'
-        6: 3,  # 'ı'
-        40: 0,  # 'Åž'
-        19: 0,  # 'ÅŸ'
-    },
-    52: {  # 'F'
-        23: 0,  # 'A'
-        37: 1,  # 'B'
-        47: 1,  # 'C'
-        39: 1,  # 'D'
-        29: 1,  # 'E'
-        52: 2,  # 'F'
-        36: 0,  # 'G'
-        45: 2,  # 'H'
-        53: 1,  # 'I'
-        60: 0,  # 'J'
-        16: 0,  # 'K'
-        49: 0,  # 'L'
-        20: 1,  # 'M'
-        46: 1,  # 'N'
-        42: 1,  # 'O'
-        48: 2,  # 'P'
-        44: 1,  # 'R'
-        35: 1,  # 'S'
-        31: 1,  # 'T'
-        51: 1,  # 'U'
-        38: 1,  # 'V'
-        62: 0,  # 'W'
-        43: 2,  # 'Y'
-        56: 0,  # 'Z'
-        1: 0,  # 'a'
-        21: 1,  # 'b'
-        28: 1,  # 'c'
-        12: 1,  # 'd'
-        2: 0,  # 'e'
-        18: 1,  # 'f'
-        27: 0,  # 'g'
-        25: 0,  # 'h'
-        3: 2,  # 'i'
-        24: 1,  # 'j'
-        10: 0,  # 'k'
-        5: 0,  # 'l'
-        13: 1,  # 'm'
-        4: 2,  # 'n'
-        15: 1,  # 'o'
-        26: 0,  # 'p'
-        7: 2,  # 'r'
-        8: 1,  # 's'
-        9: 1,  # 't'
-        14: 1,  # 'u'
-        32: 0,  # 'v'
-        57: 0,  # 'w'
-        58: 0,  # 'x'
-        11: 1,  # 'y'
-        22: 1,  # 'z'
-        63: 0,  # '·'
-        54: 0,  # 'Ç'
-        50: 1,  # 'Ö'
-        55: 2,  # 'Ü'
-        59: 0,  # 'â'
-        33: 0,  # 'ç'
-        61: 0,  # 'î'
-        34: 2,  # 'ö'
-        17: 0,  # 'ü'
-        30: 1,  # 'ÄŸ'
-        41: 1,  # 'İ'
-        6: 2,  # 'ı'
-        40: 0,  # 'Åž'
-        19: 2,  # 'ÅŸ'
-    },
-    36: {  # 'G'
-        23: 1,  # 'A'
-        37: 0,  # 'B'
-        47: 1,  # 'C'
-        39: 0,  # 'D'
-        29: 0,  # 'E'
-        52: 1,  # 'F'
-        36: 2,  # 'G'
-        45: 0,  # 'H'
-        53: 0,  # 'I'
-        60: 0,  # 'J'
-        16: 2,  # 'K'
-        49: 0,  # 'L'
-        20: 0,  # 'M'
-        46: 2,  # 'N'
-        42: 1,  # 'O'
-        48: 1,  # 'P'
-        44: 1,  # 'R'
-        35: 1,  # 'S'
-        31: 0,  # 'T'
-        51: 1,  # 'U'
-        38: 2,  # 'V'
-        62: 0,  # 'W'
-        43: 0,  # 'Y'
-        56: 0,  # 'Z'
-        1: 3,  # 'a'
-        21: 0,  # 'b'
-        28: 1,  # 'c'
-        12: 0,  # 'd'
-        2: 3,  # 'e'
-        18: 0,  # 'f'
-        27: 0,  # 'g'
-        25: 0,  # 'h'
-        3: 0,  # 'i'
-        24: 1,  # 'j'
-        10: 1,  # 'k'
-        5: 0,  # 'l'
-        13: 3,  # 'm'
-        4: 2,  # 'n'
-        15: 0,  # 'o'
-        26: 1,  # 'p'
-        7: 0,  # 'r'
-        8: 1,  # 's'
-        9: 1,  # 't'
-        14: 3,  # 'u'
-        32: 0,  # 'v'
-        57: 0,  # 'w'
-        58: 1,  # 'x'
-        11: 0,  # 'y'
-        22: 2,  # 'z'
-        63: 0,  # '·'
-        54: 1,  # 'Ç'
-        50: 2,  # 'Ö'
-        55: 0,  # 'Ü'
-        59: 1,  # 'â'
-        33: 2,  # 'ç'
-        61: 0,  # 'î'
-        34: 0,  # 'ö'
-        17: 0,  # 'ü'
-        30: 1,  # 'ÄŸ'
-        41: 1,  # 'İ'
-        6: 2,  # 'ı'
-        40: 2,  # 'Åž'
-        19: 1,  # 'ÅŸ'
-    },
-    45: {  # 'H'
-        23: 0,  # 'A'
-        37: 1,  # 'B'
-        47: 0,  # 'C'
-        39: 0,  # 'D'
-        29: 0,  # 'E'
-        52: 2,  # 'F'
-        36: 2,  # 'G'
-        45: 1,  # 'H'
-        53: 1,  # 'I'
-        60: 0,  # 'J'
-        16: 2,  # 'K'
-        49: 1,  # 'L'
-        20: 0,  # 'M'
-        46: 1,  # 'N'
-        42: 1,  # 'O'
-        48: 1,  # 'P'
-        44: 0,  # 'R'
-        35: 2,  # 'S'
-        31: 0,  # 'T'
-        51: 1,  # 'U'
-        38: 2,  # 'V'
-        62: 0,  # 'W'
-        43: 0,  # 'Y'
-        56: 0,  # 'Z'
-        1: 3,  # 'a'
-        21: 0,  # 'b'
-        28: 2,  # 'c'
-        12: 0,  # 'd'
-        2: 3,  # 'e'
-        18: 0,  # 'f'
-        27: 0,  # 'g'
-        25: 0,  # 'h'
-        3: 2,  # 'i'
-        24: 0,  # 'j'
-        10: 1,  # 'k'
-        5: 0,  # 'l'
-        13: 2,  # 'm'
-        4: 0,  # 'n'
-        15: 1,  # 'o'
-        26: 1,  # 'p'
-        7: 1,  # 'r'
-        8: 0,  # 's'
-        9: 0,  # 't'
-        14: 3,  # 'u'
-        32: 0,  # 'v'
-        57: 0,  # 'w'
-        58: 0,  # 'x'
-        11: 0,  # 'y'
-        22: 2,  # 'z'
-        63: 0,  # '·'
-        54: 1,  # 'Ç'
-        50: 1,  # 'Ö'
-        55: 0,  # 'Ü'
-        59: 0,  # 'â'
-        33: 1,  # 'ç'
-        61: 0,  # 'î'
-        34: 1,  # 'ö'
-        17: 0,  # 'ü'
-        30: 2,  # 'ÄŸ'
-        41: 1,  # 'İ'
-        6: 0,  # 'ı'
-        40: 2,  # 'Åž'
-        19: 1,  # 'ÅŸ'
-    },
-    53: {  # 'I'
-        23: 0,  # 'A'
-        37: 0,  # 'B'
-        47: 0,  # 'C'
-        39: 0,  # 'D'
-        29: 0,  # 'E'
-        52: 1,  # 'F'
-        36: 0,  # 'G'
-        45: 0,  # 'H'
-        53: 0,  # 'I'
-        60: 0,  # 'J'
-        16: 2,  # 'K'
-        49: 0,  # 'L'
-        20: 0,  # 'M'
-        46: 0,  # 'N'
-        42: 0,  # 'O'
-        48: 1,  # 'P'
-        44: 0,  # 'R'
-        35: 0,  # 'S'
-        31: 0,  # 'T'
-        51: 0,  # 'U'
-        38: 0,  # 'V'
-        62: 0,  # 'W'
-        43: 0,  # 'Y'
-        56: 0,  # 'Z'
-        1: 2,  # 'a'
-        21: 0,  # 'b'
-        28: 2,  # 'c'
-        12: 0,  # 'd'
-        2: 2,  # 'e'
-        18: 0,  # 'f'
-        27: 0,  # 'g'
-        25: 0,  # 'h'
-        3: 0,  # 'i'
-        24: 0,  # 'j'
-        10: 0,  # 'k'
-        5: 2,  # 'l'
-        13: 2,  # 'm'
-        4: 0,  # 'n'
-        15: 0,  # 'o'
-        26: 0,  # 'p'
-        7: 0,  # 'r'
-        8: 0,  # 's'
-        9: 0,  # 't'
-        14: 2,  # 'u'
-        32: 0,  # 'v'
-        57: 0,  # 'w'
-        58: 0,  # 'x'
-        11: 0,  # 'y'
-        22: 2,  # 'z'
-        63: 0,  # '·'
-        54: 1,  # 'Ç'
-        50: 0,  # 'Ö'
-        55: 0,  # 'Ü'
-        59: 0,  # 'â'
-        33: 2,  # 'ç'
-        61: 0,  # 'î'
-        34: 1,  # 'ö'
-        17: 0,  # 'ü'
-        30: 0,  # 'ÄŸ'
-        41: 0,  # 'İ'
-        6: 0,  # 'ı'
-        40: 1,  # 'Åž'
-        19: 1,  # 'ÅŸ'
-    },
-    60: {  # 'J'
-        23: 0,  # 'A'
-        37: 0,  # 'B'
-        47: 0,  # 'C'
-        39: 0,  # 'D'
-        29: 0,  # 'E'
-        52: 0,  # 'F'
-        36: 0,  # 'G'
-        45: 0,  # 'H'
-        53: 0,  # 'I'
-        60: 0,  # 'J'
-        16: 0,  # 'K'
-        49: 0,  # 'L'
-        20: 1,  # 'M'
-        46: 0,  # 'N'
-        42: 0,  # 'O'
-        48: 0,  # 'P'
-        44: 0,  # 'R'
-        35: 0,  # 'S'
-        31: 0,  # 'T'
-        51: 0,  # 'U'
-        38: 0,  # 'V'
-        62: 0,  # 'W'
-        43: 0,  # 'Y'
-        56: 0,  # 'Z'
-        1: 0,  # 'a'
-        21: 1,  # 'b'
-        28: 0,  # 'c'
-        12: 1,  # 'd'
-        2: 0,  # 'e'
-        18: 0,  # 'f'
-        27: 0,  # 'g'
-        25: 0,  # 'h'
-        3: 1,  # 'i'
-        24: 0,  # 'j'
-        10: 0,  # 'k'
-        5: 0,  # 'l'
-        13: 0,  # 'm'
-        4: 1,  # 'n'
-        15: 0,  # 'o'
-        26: 0,  # 'p'
-        7: 0,  # 'r'
-        8: 1,  # 's'
-        9: 0,  # 't'
-        14: 0,  # 'u'
-        32: 0,  # 'v'
-        57: 0,  # 'w'
-        58: 0,  # 'x'
-        11: 0,  # 'y'
-        22: 0,  # 'z'
-        63: 0,  # '·'
-        54: 0,  # 'Ç'
-        50: 0,  # 'Ö'
-        55: 0,  # 'Ü'
-        59: 0,  # 'â'
-        33: 0,  # 'ç'
-        61: 0,  # 'î'
-        34: 0,  # 'ö'
-        17: 0,  # 'ü'
-        30: 0,  # 'ÄŸ'
-        41: 0,  # 'İ'
-        6: 0,  # 'ı'
-        40: 0,  # 'Åž'
-        19: 0,  # 'ÅŸ'
-    },
-    16: {  # 'K'
-        23: 0,  # 'A'
-        37: 0,  # 'B'
-        47: 0,  # 'C'
-        39: 0,  # 'D'
-        29: 3,  # 'E'
-        52: 0,  # 'F'
-        36: 0,  # 'G'
-        45: 0,  # 'H'
-        53: 0,  # 'I'
-        60: 0,  # 'J'
-        16: 0,  # 'K'
-        49: 0,  # 'L'
-        20: 2,  # 'M'
-        46: 0,  # 'N'
-        42: 0,  # 'O'
-        48: 0,  # 'P'
-        44: 0,  # 'R'
-        35: 0,  # 'S'
-        31: 2,  # 'T'
-        51: 0,  # 'U'
-        38: 0,  # 'V'
-        62: 0,  # 'W'
-        43: 0,  # 'Y'
-        56: 0,  # 'Z'
-        1: 2,  # 'a'
-        21: 3,  # 'b'
-        28: 0,  # 'c'
-        12: 3,  # 'd'
-        2: 1,  # 'e'
-        18: 3,  # 'f'
-        27: 3,  # 'g'
-        25: 3,  # 'h'
-        3: 3,  # 'i'
-        24: 2,  # 'j'
-        10: 3,  # 'k'
-        5: 0,  # 'l'
-        13: 0,  # 'm'
-        4: 3,  # 'n'
-        15: 0,  # 'o'
-        26: 1,  # 'p'
-        7: 3,  # 'r'
-        8: 3,  # 's'
-        9: 3,  # 't'
-        14: 0,  # 'u'
-        32: 3,  # 'v'
-        57: 0,  # 'w'
-        58: 0,  # 'x'
-        11: 2,  # 'y'
-        22: 1,  # 'z'
-        63: 0,  # '·'
-        54: 0,  # 'Ç'
-        50: 0,  # 'Ö'
-        55: 0,  # 'Ü'
-        59: 0,  # 'â'
-        33: 0,  # 'ç'
-        61: 0,  # 'î'
-        34: 0,  # 'ö'
-        17: 2,  # 'ü'
-        30: 0,  # 'ÄŸ'
-        41: 1,  # 'İ'
-        6: 3,  # 'ı'
-        40: 0,  # 'Åž'
-        19: 0,  # 'ÅŸ'
-    },
-    49: {  # 'L'
-        23: 0,  # 'A'
-        37: 0,  # 'B'
-        47: 0,  # 'C'
-        39: 0,  # 'D'
-        29: 2,  # 'E'
-        52: 0,  # 'F'
-        36: 1,  # 'G'
-        45: 1,  # 'H'
-        53: 0,  # 'I'
-        60: 0,  # 'J'
-        16: 0,  # 'K'
-        49: 0,  # 'L'
-        20: 1,  # 'M'
-        46: 0,  # 'N'
-        42: 2,  # 'O'
-        48: 0,  # 'P'
-        44: 0,  # 'R'
-        35: 0,  # 'S'
-        31: 0,  # 'T'
-        51: 0,  # 'U'
-        38: 0,  # 'V'
-        62: 0,  # 'W'
-        43: 1,  # 'Y'
-        56: 0,  # 'Z'
-        1: 0,  # 'a'
-        21: 3,  # 'b'
-        28: 0,  # 'c'
-        12: 2,  # 'd'
-        2: 0,  # 'e'
-        18: 0,  # 'f'
-        27: 0,  # 'g'
-        25: 0,  # 'h'
-        3: 2,  # 'i'
-        24: 0,  # 'j'
-        10: 1,  # 'k'
-        5: 0,  # 'l'
-        13: 0,  # 'm'
-        4: 2,  # 'n'
-        15: 1,  # 'o'
-        26: 1,  # 'p'
-        7: 1,  # 'r'
-        8: 1,  # 's'
-        9: 1,  # 't'
-        14: 0,  # 'u'
-        32: 0,  # 'v'
-        57: 0,  # 'w'
-        58: 0,  # 'x'
-        11: 2,  # 'y'
-        22: 0,  # 'z'
-        63: 0,  # '·'
-        54: 0,  # 'Ç'
-        50: 0,  # 'Ö'
-        55: 2,  # 'Ü'
-        59: 0,  # 'â'
-        33: 0,  # 'ç'
-        61: 0,  # 'î'
-        34: 1,  # 'ö'
-        17: 1,  # 'ü'
-        30: 1,  # 'ÄŸ'
-        41: 0,  # 'İ'
-        6: 2,  # 'ı'
-        40: 0,  # 'Åž'
-        19: 0,  # 'ÅŸ'
-    },
-    20: {  # 'M'
-        23: 1,  # 'A'
-        37: 0,  # 'B'
-        47: 0,  # 'C'
-        39: 0,  # 'D'
-        29: 0,  # 'E'
-        52: 0,  # 'F'
-        36: 0,  # 'G'
-        45: 0,  # 'H'
-        53: 0,  # 'I'
-        60: 1,  # 'J'
-        16: 3,  # 'K'
-        49: 0,  # 'L'
-        20: 2,  # 'M'
-        46: 0,  # 'N'
-        42: 0,  # 'O'
-        48: 0,  # 'P'
-        44: 0,  # 'R'
-        35: 0,  # 'S'
-        31: 1,  # 'T'
-        51: 0,  # 'U'
-        38: 0,  # 'V'
-        62: 0,  # 'W'
-        43: 0,  # 'Y'
-        56: 0,  # 'Z'
-        1: 3,  # 'a'
-        21: 2,  # 'b'
-        28: 0,  # 'c'
-        12: 3,  # 'd'
-        2: 3,  # 'e'
-        18: 0,  # 'f'
-        27: 1,  # 'g'
-        25: 1,  # 'h'
-        3: 2,  # 'i'
-        24: 2,  # 'j'
-        10: 2,  # 'k'
-        5: 2,  # 'l'
-        13: 3,  # 'm'
-        4: 3,  # 'n'
-        15: 0,  # 'o'
-        26: 1,  # 'p'
-        7: 3,  # 'r'
-        8: 0,  # 's'
-        9: 2,  # 't'
-        14: 3,  # 'u'
-        32: 0,  # 'v'
-        57: 0,  # 'w'
-        58: 0,  # 'x'
-        11: 2,  # 'y'
-        22: 0,  # 'z'
-        63: 0,  # '·'
-        54: 0,  # 'Ç'
-        50: 0,  # 'Ö'
-        55: 0,  # 'Ü'
-        59: 0,  # 'â'
-        33: 3,  # 'ç'
-        61: 0,  # 'î'
-        34: 0,  # 'ö'
-        17: 0,  # 'ü'
-        30: 0,  # 'ÄŸ'
-        41: 0,  # 'İ'
-        6: 3,  # 'ı'
-        40: 0,  # 'Åž'
-        19: 0,  # 'ÅŸ'
-    },
-    46: {  # 'N'
-        23: 0,  # 'A'
-        37: 1,  # 'B'
-        47: 0,  # 'C'
-        39: 0,  # 'D'
-        29: 0,  # 'E'
-        52: 1,  # 'F'
-        36: 1,  # 'G'
-        45: 1,  # 'H'
-        53: 0,  # 'I'
-        60: 0,  # 'J'
-        16: 2,  # 'K'
-        49: 0,  # 'L'
-        20: 0,  # 'M'
-        46: 1,  # 'N'
-        42: 0,  # 'O'
-        48: 0,  # 'P'
-        44: 1,  # 'R'
-        35: 1,  # 'S'
-        31: 0,  # 'T'
-        51: 1,  # 'U'
-        38: 2,  # 'V'
-        62: 0,  # 'W'
-        43: 1,  # 'Y'
-        56: 0,  # 'Z'
-        1: 3,  # 'a'
-        21: 0,  # 'b'
-        28: 2,  # 'c'
-        12: 0,  # 'd'
-        2: 3,  # 'e'
-        18: 0,  # 'f'
-        27: 1,  # 'g'
-        25: 0,  # 'h'
-        3: 0,  # 'i'
-        24: 2,  # 'j'
-        10: 1,  # 'k'
-        5: 1,  # 'l'
-        13: 3,  # 'm'
-        4: 2,  # 'n'
-        15: 1,  # 'o'
-        26: 1,  # 'p'
-        7: 1,  # 'r'
-        8: 0,  # 's'
-        9: 0,  # 't'
-        14: 3,  # 'u'
-        32: 0,  # 'v'
-        57: 0,  # 'w'
-        58: 1,  # 'x'
-        11: 1,  # 'y'
-        22: 2,  # 'z'
-        63: 0,  # '·'
-        54: 1,  # 'Ç'
-        50: 1,  # 'Ö'
-        55: 0,  # 'Ü'
-        59: 0,  # 'â'
-        33: 0,  # 'ç'
-        61: 0,  # 'î'
-        34: 1,  # 'ö'
-        17: 0,  # 'ü'
-        30: 0,  # 'ÄŸ'
-        41: 1,  # 'İ'
-        6: 2,  # 'ı'
-        40: 1,  # 'Åž'
-        19: 1,  # 'ÅŸ'
-    },
-    42: {  # 'O'
-        23: 0,  # 'A'
-        37: 0,  # 'B'
-        47: 0,  # 'C'
-        39: 0,  # 'D'
-        29: 0,  # 'E'
-        52: 1,  # 'F'
-        36: 0,  # 'G'
-        45: 1,  # 'H'
-        53: 0,  # 'I'
-        60: 0,  # 'J'
-        16: 2,  # 'K'
-        49: 1,  # 'L'
-        20: 0,  # 'M'
-        46: 0,  # 'N'
-        42: 0,  # 'O'
-        48: 2,  # 'P'
-        44: 1,  # 'R'
-        35: 1,  # 'S'
-        31: 0,  # 'T'
-        51: 1,  # 'U'
-        38: 1,  # 'V'
-        62: 0,  # 'W'
-        43: 0,  # 'Y'
-        56: 0,  # 'Z'
-        1: 3,  # 'a'
-        21: 0,  # 'b'
-        28: 2,  # 'c'
-        12: 0,  # 'd'
-        2: 2,  # 'e'
-        18: 0,  # 'f'
-        27: 0,  # 'g'
-        25: 0,  # 'h'
-        3: 0,  # 'i'
-        24: 0,  # 'j'
-        10: 0,  # 'k'
-        5: 3,  # 'l'
-        13: 3,  # 'm'
-        4: 0,  # 'n'
-        15: 1,  # 'o'
-        26: 0,  # 'p'
-        7: 0,  # 'r'
-        8: 0,  # 's'
-        9: 0,  # 't'
-        14: 2,  # 'u'
-        32: 0,  # 'v'
-        57: 0,  # 'w'
-        58: 0,  # 'x'
-        11: 0,  # 'y'
-        22: 2,  # 'z'
-        63: 0,  # '·'
-        54: 2,  # 'Ç'
-        50: 1,  # 'Ö'
-        55: 0,  # 'Ü'
-        59: 0,  # 'â'
-        33: 2,  # 'ç'
-        61: 0,  # 'î'
-        34: 1,  # 'ö'
-        17: 0,  # 'ü'
-        30: 1,  # 'ÄŸ'
-        41: 2,  # 'İ'
-        6: 1,  # 'ı'
-        40: 1,  # 'Åž'
-        19: 1,  # 'ÅŸ'
-    },
-    48: {  # 'P'
-        23: 0,  # 'A'
-        37: 0,  # 'B'
-        47: 2,  # 'C'
-        39: 0,  # 'D'
-        29: 0,  # 'E'
-        52: 2,  # 'F'
-        36: 1,  # 'G'
-        45: 1,  # 'H'
-        53: 0,  # 'I'
-        60: 0,  # 'J'
-        16: 2,  # 'K'
-        49: 0,  # 'L'
-        20: 0,  # 'M'
-        46: 1,  # 'N'
-        42: 1,  # 'O'
-        48: 1,  # 'P'
-        44: 0,  # 'R'
-        35: 1,  # 'S'
-        31: 0,  # 'T'
-        51: 0,  # 'U'
-        38: 1,  # 'V'
-        62: 0,  # 'W'
-        43: 0,  # 'Y'
-        56: 0,  # 'Z'
-        1: 2,  # 'a'
-        21: 0,  # 'b'
-        28: 2,  # 'c'
-        12: 0,  # 'd'
-        2: 3,  # 'e'
-        18: 0,  # 'f'
-        27: 0,  # 'g'
-        25: 0,  # 'h'
-        3: 0,  # 'i'
-        24: 0,  # 'j'
-        10: 1,  # 'k'
-        5: 0,  # 'l'
-        13: 2,  # 'm'
-        4: 0,  # 'n'
-        15: 2,  # 'o'
-        26: 0,  # 'p'
-        7: 0,  # 'r'
-        8: 0,  # 's'
-        9: 0,  # 't'
-        14: 2,  # 'u'
-        32: 0,  # 'v'
-        57: 0,  # 'w'
-        58: 2,  # 'x'
-        11: 0,  # 'y'
-        22: 2,  # 'z'
-        63: 0,  # '·'
-        54: 1,  # 'Ç'
-        50: 2,  # 'Ö'
-        55: 0,  # 'Ü'
-        59: 0,  # 'â'
-        33: 0,  # 'ç'
-        61: 0,  # 'î'
-        34: 2,  # 'ö'
-        17: 0,  # 'ü'
-        30: 1,  # 'ÄŸ'
-        41: 1,  # 'İ'
-        6: 0,  # 'ı'
-        40: 2,  # 'Åž'
-        19: 1,  # 'ÅŸ'
-    },
-    44: {  # 'R'
-        23: 0,  # 'A'
-        37: 0,  # 'B'
-        47: 1,  # 'C'
-        39: 0,  # 'D'
-        29: 0,  # 'E'
-        52: 1,  # 'F'
-        36: 0,  # 'G'
-        45: 0,  # 'H'
-        53: 0,  # 'I'
-        60: 0,  # 'J'
-        16: 3,  # 'K'
-        49: 0,  # 'L'
-        20: 0,  # 'M'
-        46: 0,  # 'N'
-        42: 0,  # 'O'
-        48: 1,  # 'P'
-        44: 0,  # 'R'
-        35: 0,  # 'S'
-        31: 0,  # 'T'
-        51: 0,  # 'U'
-        38: 0,  # 'V'
-        62: 0,  # 'W'
-        43: 1,  # 'Y'
-        56: 0,  # 'Z'
-        1: 3,  # 'a'
-        21: 1,  # 'b'
-        28: 1,  # 'c'
-        12: 0,  # 'd'
-        2: 2,  # 'e'
-        18: 0,  # 'f'
-        27: 0,  # 'g'
-        25: 0,  # 'h'
-        3: 0,  # 'i'
-        24: 0,  # 'j'
-        10: 1,  # 'k'
-        5: 2,  # 'l'
-        13: 2,  # 'm'
-        4: 0,  # 'n'
-        15: 1,  # 'o'
-        26: 0,  # 'p'
-        7: 0,  # 'r'
-        8: 0,  # 's'
-        9: 0,  # 't'
-        14: 2,  # 'u'
-        32: 0,  # 'v'
-        57: 0,  # 'w'
-        58: 0,  # 'x'
-        11: 1,  # 'y'
-        22: 2,  # 'z'
-        63: 0,  # '·'
-        54: 0,  # 'Ç'
-        50: 1,  # 'Ö'
-        55: 0,  # 'Ü'
-        59: 0,  # 'â'
-        33: 1,  # 'ç'
-        61: 0,  # 'î'
-        34: 1,  # 'ö'
-        17: 1,  # 'ü'
-        30: 1,  # 'ÄŸ'
-        41: 0,  # 'İ'
-        6: 2,  # 'ı'
-        40: 1,  # 'Åž'
-        19: 1,  # 'ÅŸ'
-    },
-    35: {  # 'S'
-        23: 0,  # 'A'
-        37: 0,  # 'B'
-        47: 1,  # 'C'
-        39: 0,  # 'D'
-        29: 0,  # 'E'
-        52: 1,  # 'F'
-        36: 1,  # 'G'
-        45: 1,  # 'H'
-        53: 0,  # 'I'
-        60: 0,  # 'J'
-        16: 3,  # 'K'
-        49: 1,  # 'L'
-        20: 1,  # 'M'
-        46: 0,  # 'N'
-        42: 0,  # 'O'
-        48: 1,  # 'P'
-        44: 0,  # 'R'
-        35: 0,  # 'S'
-        31: 0,  # 'T'
-        51: 1,  # 'U'
-        38: 1,  # 'V'
-        62: 0,  # 'W'
-        43: 1,  # 'Y'
-        56: 0,  # 'Z'
-        1: 3,  # 'a'
-        21: 0,  # 'b'
-        28: 2,  # 'c'
-        12: 0,  # 'd'
-        2: 3,  # 'e'
-        18: 0,  # 'f'
-        27: 0,  # 'g'
-        25: 0,  # 'h'
-        3: 0,  # 'i'
-        24: 0,  # 'j'
-        10: 1,  # 'k'
-        5: 1,  # 'l'
-        13: 2,  # 'm'
-        4: 1,  # 'n'
-        15: 0,  # 'o'
-        26: 0,  # 'p'
-        7: 0,  # 'r'
-        8: 0,  # 's'
-        9: 1,  # 't'
-        14: 2,  # 'u'
-        32: 0,  # 'v'
-        57: 0,  # 'w'
-        58: 0,  # 'x'
-        11: 0,  # 'y'
-        22: 1,  # 'z'
-        63: 0,  # '·'
-        54: 2,  # 'Ç'
-        50: 2,  # 'Ö'
-        55: 0,  # 'Ü'
-        59: 0,  # 'â'
-        33: 3,  # 'ç'
-        61: 0,  # 'î'
-        34: 1,  # 'ö'
-        17: 0,  # 'ü'
-        30: 0,  # 'ÄŸ'
-        41: 0,  # 'İ'
-        6: 3,  # 'ı'
-        40: 2,  # 'Åž'
-        19: 1,  # 'ÅŸ'
-    },
-    31: {  # 'T'
-        23: 0,  # 'A'
-        37: 0,  # 'B'
-        47: 0,  # 'C'
-        39: 0,  # 'D'
-        29: 0,  # 'E'
-        52: 0,  # 'F'
-        36: 0,  # 'G'
-        45: 0,  # 'H'
-        53: 0,  # 'I'
-        60: 1,  # 'J'
-        16: 2,  # 'K'
-        49: 0,  # 'L'
-        20: 1,  # 'M'
-        46: 0,  # 'N'
-        42: 0,  # 'O'
-        48: 0,  # 'P'
-        44: 0,  # 'R'
-        35: 0,  # 'S'
-        31: 2,  # 'T'
-        51: 0,  # 'U'
-        38: 0,  # 'V'
-        62: 0,  # 'W'
-        43: 0,  # 'Y'
-        56: 0,  # 'Z'
-        1: 3,  # 'a'
-        21: 2,  # 'b'
-        28: 0,  # 'c'
-        12: 1,  # 'd'
-        2: 3,  # 'e'
-        18: 2,  # 'f'
-        27: 2,  # 'g'
-        25: 0,  # 'h'
-        3: 1,  # 'i'
-        24: 1,  # 'j'
-        10: 2,  # 'k'
-        5: 2,  # 'l'
-        13: 3,  # 'm'
-        4: 3,  # 'n'
-        15: 0,  # 'o'
-        26: 2,  # 'p'
-        7: 2,  # 'r'
-        8: 0,  # 's'
-        9: 2,  # 't'
-        14: 2,  # 'u'
-        32: 1,  # 'v'
-        57: 1,  # 'w'
-        58: 1,  # 'x'
-        11: 2,  # 'y'
-        22: 0,  # 'z'
-        63: 0,  # '·'
-        54: 0,  # 'Ç'
-        50: 0,  # 'Ö'
-        55: 0,  # 'Ü'
-        59: 0,  # 'â'
-        33: 0,  # 'ç'
-        61: 0,  # 'î'
-        34: 0,  # 'ö'
-        17: 1,  # 'ü'
-        30: 0,  # 'ÄŸ'
-        41: 0,  # 'İ'
-        6: 3,  # 'ı'
-        40: 0,  # 'Åž'
-        19: 0,  # 'ÅŸ'
-    },
-    51: {  # 'U'
-        23: 0,  # 'A'
-        37: 0,  # 'B'
-        47: 0,  # 'C'
-        39: 0,  # 'D'
-        29: 0,  # 'E'
-        52: 1,  # 'F'
-        36: 1,  # 'G'
-        45: 0,  # 'H'
-        53: 0,  # 'I'
-        60: 0,  # 'J'
-        16: 1,  # 'K'
-        49: 0,  # 'L'
-        20: 0,  # 'M'
-        46: 1,  # 'N'
-        42: 0,  # 'O'
-        48: 1,  # 'P'
-        44: 0,  # 'R'
-        35: 0,  # 'S'
-        31: 0,  # 'T'
-        51: 1,  # 'U'
-        38: 1,  # 'V'
-        62: 0,  # 'W'
-        43: 0,  # 'Y'
-        56: 0,  # 'Z'
-        1: 3,  # 'a'
-        21: 0,  # 'b'
-        28: 1,  # 'c'
-        12: 0,  # 'd'
-        2: 3,  # 'e'
-        18: 0,  # 'f'
-        27: 2,  # 'g'
-        25: 0,  # 'h'
-        3: 0,  # 'i'
-        24: 0,  # 'j'
-        10: 1,  # 'k'
-        5: 1,  # 'l'
-        13: 3,  # 'm'
-        4: 2,  # 'n'
-        15: 0,  # 'o'
-        26: 1,  # 'p'
-        7: 0,  # 'r'
-        8: 0,  # 's'
-        9: 0,  # 't'
-        14: 2,  # 'u'
-        32: 0,  # 'v'
-        57: 0,  # 'w'
-        58: 0,  # 'x'
-        11: 0,  # 'y'
-        22: 2,  # 'z'
-        63: 0,  # '·'
-        54: 1,  # 'Ç'
-        50: 1,  # 'Ö'
-        55: 0,  # 'Ü'
-        59: 0,  # 'â'
-        33: 0,  # 'ç'
-        61: 0,  # 'î'
-        34: 0,  # 'ö'
-        17: 0,  # 'ü'
-        30: 1,  # 'ÄŸ'
-        41: 1,  # 'İ'
-        6: 2,  # 'ı'
-        40: 0,  # 'Åž'
-        19: 1,  # 'ÅŸ'
-    },
-    38: {  # 'V'
-        23: 1,  # 'A'
-        37: 1,  # 'B'
-        47: 1,  # 'C'
-        39: 0,  # 'D'
-        29: 0,  # 'E'
-        52: 2,  # 'F'
-        36: 0,  # 'G'
-        45: 0,  # 'H'
-        53: 0,  # 'I'
-        60: 0,  # 'J'
-        16: 3,  # 'K'
-        49: 0,  # 'L'
-        20: 3,  # 'M'
-        46: 0,  # 'N'
-        42: 0,  # 'O'
-        48: 1,  # 'P'
-        44: 1,  # 'R'
-        35: 0,  # 'S'
-        31: 0,  # 'T'
-        51: 1,  # 'U'
-        38: 1,  # 'V'
-        62: 0,  # 'W'
-        43: 0,  # 'Y'
-        56: 0,  # 'Z'
-        1: 3,  # 'a'
-        21: 0,  # 'b'
-        28: 2,  # 'c'
-        12: 0,  # 'd'
-        2: 3,  # 'e'
-        18: 0,  # 'f'
-        27: 0,  # 'g'
-        25: 0,  # 'h'
-        3: 0,  # 'i'
-        24: 0,  # 'j'
-        10: 0,  # 'k'
-        5: 2,  # 'l'
-        13: 2,  # 'm'
-        4: 0,  # 'n'
-        15: 2,  # 'o'
-        26: 0,  # 'p'
-        7: 0,  # 'r'
-        8: 0,  # 's'
-        9: 1,  # 't'
-        14: 3,  # 'u'
-        32: 0,  # 'v'
-        57: 0,  # 'w'
-        58: 0,  # 'x'
-        11: 1,  # 'y'
-        22: 2,  # 'z'
-        63: 0,  # '·'
-        54: 1,  # 'Ç'
-        50: 1,  # 'Ö'
-        55: 0,  # 'Ü'
-        59: 1,  # 'â'
-        33: 2,  # 'ç'
-        61: 0,  # 'î'
-        34: 1,  # 'ö'
-        17: 0,  # 'ü'
-        30: 1,  # 'ÄŸ'
-        41: 1,  # 'İ'
-        6: 3,  # 'ı'
-        40: 2,  # 'Åž'
-        19: 1,  # 'ÅŸ'
-    },
-    62: {  # 'W'
-        23: 0,  # 'A'
-        37: 0,  # 'B'
-        47: 0,  # 'C'
-        39: 0,  # 'D'
-        29: 0,  # 'E'
-        52: 0,  # 'F'
-        36: 0,  # 'G'
-        45: 0,  # 'H'
-        53: 0,  # 'I'
-        60: 0,  # 'J'
-        16: 0,  # 'K'
-        49: 0,  # 'L'
-        20: 0,  # 'M'
-        46: 0,  # 'N'
-        42: 0,  # 'O'
-        48: 0,  # 'P'
-        44: 0,  # 'R'
-        35: 0,  # 'S'
-        31: 0,  # 'T'
-        51: 0,  # 'U'
-        38: 0,  # 'V'
-        62: 0,  # 'W'
-        43: 0,  # 'Y'
-        56: 0,  # 'Z'
-        1: 0,  # 'a'
-        21: 0,  # 'b'
-        28: 0,  # 'c'
-        12: 0,  # 'd'
-        2: 0,  # 'e'
-        18: 0,  # 'f'
-        27: 0,  # 'g'
-        25: 0,  # 'h'
-        3: 0,  # 'i'
-        24: 0,  # 'j'
-        10: 0,  # 'k'
-        5: 0,  # 'l'
-        13: 0,  # 'm'
-        4: 0,  # 'n'
-        15: 0,  # 'o'
-        26: 0,  # 'p'
-        7: 0,  # 'r'
-        8: 0,  # 's'
-        9: 0,  # 't'
-        14: 0,  # 'u'
-        32: 0,  # 'v'
-        57: 0,  # 'w'
-        58: 0,  # 'x'
-        11: 0,  # 'y'
-        22: 0,  # 'z'
-        63: 0,  # '·'
-        54: 0,  # 'Ç'
-        50: 0,  # 'Ö'
-        55: 0,  # 'Ü'
-        59: 0,  # 'â'
-        33: 0,  # 'ç'
-        61: 0,  # 'î'
-        34: 0,  # 'ö'
-        17: 0,  # 'ü'
-        30: 0,  # 'ÄŸ'
-        41: 0,  # 'İ'
-        6: 0,  # 'ı'
-        40: 0,  # 'Åž'
-        19: 0,  # 'ÅŸ'
-    },
-    43: {  # 'Y'
-        23: 0,  # 'A'
-        37: 0,  # 'B'
-        47: 1,  # 'C'
-        39: 0,  # 'D'
-        29: 0,  # 'E'
-        52: 2,  # 'F'
-        36: 0,  # 'G'
-        45: 1,  # 'H'
-        53: 1,  # 'I'
-        60: 0,  # 'J'
-        16: 2,  # 'K'
-        49: 0,  # 'L'
-        20: 0,  # 'M'
-        46: 2,  # 'N'
-        42: 0,  # 'O'
-        48: 2,  # 'P'
-        44: 1,  # 'R'
-        35: 1,  # 'S'
-        31: 0,  # 'T'
-        51: 1,  # 'U'
-        38: 2,  # 'V'
-        62: 0,  # 'W'
-        43: 0,  # 'Y'
-        56: 0,  # 'Z'
-        1: 3,  # 'a'
-        21: 0,  # 'b'
-        28: 2,  # 'c'
-        12: 0,  # 'd'
-        2: 2,  # 'e'
-        18: 0,  # 'f'
-        27: 0,  # 'g'
-        25: 0,  # 'h'
-        3: 0,  # 'i'
-        24: 1,  # 'j'
-        10: 1,  # 'k'
-        5: 1,  # 'l'
-        13: 3,  # 'm'
-        4: 0,  # 'n'
-        15: 2,  # 'o'
-        26: 0,  # 'p'
-        7: 0,  # 'r'
-        8: 0,  # 's'
-        9: 0,  # 't'
-        14: 3,  # 'u'
-        32: 0,  # 'v'
-        57: 0,  # 'w'
-        58: 1,  # 'x'
-        11: 0,  # 'y'
-        22: 2,  # 'z'
-        63: 0,  # '·'
-        54: 1,  # 'Ç'
-        50: 2,  # 'Ö'
-        55: 1,  # 'Ü'
-        59: 1,  # 'â'
-        33: 0,  # 'ç'
-        61: 0,  # 'î'
-        34: 1,  # 'ö'
-        17: 0,  # 'ü'
-        30: 1,  # 'ÄŸ'
-        41: 1,  # 'İ'
-        6: 0,  # 'ı'
-        40: 2,  # 'Åž'
-        19: 1,  # 'ÅŸ'
-    },
-    56: {  # 'Z'
-        23: 0,  # 'A'
-        37: 0,  # 'B'
-        47: 0,  # 'C'
-        39: 0,  # 'D'
-        29: 0,  # 'E'
-        52: 0,  # 'F'
-        36: 0,  # 'G'
-        45: 0,  # 'H'
-        53: 0,  # 'I'
-        60: 0,  # 'J'
-        16: 0,  # 'K'
-        49: 0,  # 'L'
-        20: 0,  # 'M'
-        46: 0,  # 'N'
-        42: 0,  # 'O'
-        48: 0,  # 'P'
-        44: 0,  # 'R'
-        35: 0,  # 'S'
-        31: 0,  # 'T'
-        51: 0,  # 'U'
-        38: 0,  # 'V'
-        62: 0,  # 'W'
-        43: 0,  # 'Y'
-        56: 2,  # 'Z'
-        1: 2,  # 'a'
-        21: 1,  # 'b'
-        28: 0,  # 'c'
-        12: 0,  # 'd'
-        2: 2,  # 'e'
-        18: 0,  # 'f'
-        27: 0,  # 'g'
-        25: 0,  # 'h'
-        3: 2,  # 'i'
-        24: 1,  # 'j'
-        10: 0,  # 'k'
-        5: 0,  # 'l'
-        13: 1,  # 'm'
-        4: 1,  # 'n'
-        15: 0,  # 'o'
-        26: 0,  # 'p'
-        7: 1,  # 'r'
-        8: 1,  # 's'
-        9: 0,  # 't'
-        14: 2,  # 'u'
-        32: 0,  # 'v'
-        57: 0,  # 'w'
-        58: 0,  # 'x'
-        11: 0,  # 'y'
-        22: 0,  # 'z'
-        63: 0,  # '·'
-        54: 0,  # 'Ç'
-        50: 0,  # 'Ö'
-        55: 0,  # 'Ü'
-        59: 0,  # 'â'
-        33: 0,  # 'ç'
-        61: 0,  # 'î'
-        34: 0,  # 'ö'
-        17: 1,  # 'ü'
-        30: 0,  # 'ÄŸ'
-        41: 0,  # 'İ'
-        6: 1,  # 'ı'
-        40: 0,  # 'Åž'
-        19: 0,  # 'ÅŸ'
-    },
-    1: {  # 'a'
-        23: 3,  # 'A'
-        37: 0,  # 'B'
-        47: 1,  # 'C'
-        39: 0,  # 'D'
-        29: 3,  # 'E'
-        52: 0,  # 'F'
-        36: 1,  # 'G'
-        45: 1,  # 'H'
-        53: 0,  # 'I'
-        60: 0,  # 'J'
-        16: 0,  # 'K'
-        49: 0,  # 'L'
-        20: 3,  # 'M'
-        46: 1,  # 'N'
-        42: 0,  # 'O'
-        48: 1,  # 'P'
-        44: 0,  # 'R'
-        35: 0,  # 'S'
-        31: 3,  # 'T'
-        51: 0,  # 'U'
-        38: 1,  # 'V'
-        62: 0,  # 'W'
-        43: 0,  # 'Y'
-        56: 2,  # 'Z'
-        1: 2,  # 'a'
-        21: 3,  # 'b'
-        28: 0,  # 'c'
-        12: 3,  # 'd'
-        2: 2,  # 'e'
-        18: 3,  # 'f'
-        27: 3,  # 'g'
-        25: 3,  # 'h'
-        3: 3,  # 'i'
-        24: 3,  # 'j'
-        10: 3,  # 'k'
-        5: 0,  # 'l'
-        13: 2,  # 'm'
-        4: 3,  # 'n'
-        15: 1,  # 'o'
-        26: 3,  # 'p'
-        7: 3,  # 'r'
-        8: 3,  # 's'
-        9: 3,  # 't'
-        14: 3,  # 'u'
-        32: 3,  # 'v'
-        57: 2,  # 'w'
-        58: 0,  # 'x'
-        11: 3,  # 'y'
-        22: 0,  # 'z'
-        63: 1,  # '·'
-        54: 0,  # 'Ç'
-        50: 0,  # 'Ö'
-        55: 0,  # 'Ü'
-        59: 0,  # 'â'
-        33: 1,  # 'ç'
-        61: 1,  # 'î'
-        34: 1,  # 'ö'
-        17: 3,  # 'ü'
-        30: 0,  # 'ÄŸ'
-        41: 0,  # 'İ'
-        6: 3,  # 'ı'
-        40: 0,  # 'Åž'
-        19: 1,  # 'ÅŸ'
-    },
-    21: {  # 'b'
-        23: 0,  # 'A'
-        37: 0,  # 'B'
-        47: 0,  # 'C'
-        39: 0,  # 'D'
-        29: 0,  # 'E'
-        52: 0,  # 'F'
-        36: 1,  # 'G'
-        45: 0,  # 'H'
-        53: 0,  # 'I'
-        60: 1,  # 'J'
-        16: 2,  # 'K'
-        49: 0,  # 'L'
-        20: 2,  # 'M'
-        46: 0,  # 'N'
-        42: 0,  # 'O'
-        48: 0,  # 'P'
-        44: 0,  # 'R'
-        35: 0,  # 'S'
-        31: 1,  # 'T'
-        51: 0,  # 'U'
-        38: 0,  # 'V'
-        62: 0,  # 'W'
-        43: 1,  # 'Y'
-        56: 0,  # 'Z'
-        1: 3,  # 'a'
-        21: 2,  # 'b'
-        28: 0,  # 'c'
-        12: 3,  # 'd'
-        2: 3,  # 'e'
-        18: 0,  # 'f'
-        27: 3,  # 'g'
-        25: 1,  # 'h'
-        3: 3,  # 'i'
-        24: 2,  # 'j'
-        10: 3,  # 'k'
-        5: 3,  # 'l'
-        13: 3,  # 'm'
-        4: 3,  # 'n'
-        15: 0,  # 'o'
-        26: 3,  # 'p'
-        7: 1,  # 'r'
-        8: 2,  # 's'
-        9: 2,  # 't'
-        14: 2,  # 'u'
-        32: 1,  # 'v'
-        57: 0,  # 'w'
-        58: 1,  # 'x'
-        11: 3,  # 'y'
-        22: 0,  # 'z'
-        63: 0,  # '·'
-        54: 0,  # 'Ç'
-        50: 0,  # 'Ö'
-        55: 0,  # 'Ü'
-        59: 0,  # 'â'
-        33: 1,  # 'ç'
-        61: 0,  # 'î'
-        34: 0,  # 'ö'
-        17: 0,  # 'ü'
-        30: 1,  # 'ÄŸ'
-        41: 0,  # 'İ'
-        6: 2,  # 'ı'
-        40: 0,  # 'Åž'
-        19: 0,  # 'ÅŸ'
-    },
-    28: {  # 'c'
-        23: 0,  # 'A'
-        37: 1,  # 'B'
-        47: 1,  # 'C'
-        39: 1,  # 'D'
-        29: 2,  # 'E'
-        52: 0,  # 'F'
-        36: 2,  # 'G'
-        45: 2,  # 'H'
-        53: 1,  # 'I'
-        60: 0,  # 'J'
-        16: 0,  # 'K'
-        49: 0,  # 'L'
-        20: 2,  # 'M'
-        46: 1,  # 'N'
-        42: 1,  # 'O'
-        48: 2,  # 'P'
-        44: 1,  # 'R'
-        35: 1,  # 'S'
-        31: 2,  # 'T'
-        51: 2,  # 'U'
-        38: 2,  # 'V'
-        62: 0,  # 'W'
-        43: 3,  # 'Y'
-        56: 0,  # 'Z'
-        1: 1,  # 'a'
-        21: 1,  # 'b'
-        28: 2,  # 'c'
-        12: 2,  # 'd'
-        2: 1,  # 'e'
-        18: 1,  # 'f'
-        27: 2,  # 'g'
-        25: 2,  # 'h'
-        3: 3,  # 'i'
-        24: 1,  # 'j'
-        10: 3,  # 'k'
-        5: 0,  # 'l'
-        13: 2,  # 'm'
-        4: 3,  # 'n'
-        15: 2,  # 'o'
-        26: 2,  # 'p'
-        7: 3,  # 'r'
-        8: 3,  # 's'
-        9: 3,  # 't'
-        14: 1,  # 'u'
-        32: 0,  # 'v'
-        57: 1,  # 'w'
-        58: 0,  # 'x'
-        11: 2,  # 'y'
-        22: 1,  # 'z'
-        63: 1,  # '·'
-        54: 0,  # 'Ç'
-        50: 0,  # 'Ö'
-        55: 1,  # 'Ü'
-        59: 0,  # 'â'
-        33: 0,  # 'ç'
-        61: 1,  # 'î'
-        34: 2,  # 'ö'
-        17: 2,  # 'ü'
-        30: 2,  # 'ÄŸ'
-        41: 1,  # 'İ'
-        6: 3,  # 'ı'
-        40: 0,  # 'Åž'
-        19: 2,  # 'ÅŸ'
-    },
-    12: {  # 'd'
-        23: 1,  # 'A'
-        37: 0,  # 'B'
-        47: 0,  # 'C'
-        39: 0,  # 'D'
-        29: 0,  # 'E'
-        52: 0,  # 'F'
-        36: 0,  # 'G'
-        45: 0,  # 'H'
-        53: 0,  # 'I'
-        60: 2,  # 'J'
-        16: 3,  # 'K'
-        49: 0,  # 'L'
-        20: 3,  # 'M'
-        46: 0,  # 'N'
-        42: 0,  # 'O'
-        48: 0,  # 'P'
-        44: 0,  # 'R'
-        35: 1,  # 'S'
-        31: 1,  # 'T'
-        51: 0,  # 'U'
-        38: 0,  # 'V'
-        62: 0,  # 'W'
-        43: 0,  # 'Y'
-        56: 0,  # 'Z'
-        1: 3,  # 'a'
-        21: 2,  # 'b'
-        28: 1,  # 'c'
-        12: 3,  # 'd'
-        2: 3,  # 'e'
-        18: 1,  # 'f'
-        27: 3,  # 'g'
-        25: 3,  # 'h'
-        3: 2,  # 'i'
-        24: 3,  # 'j'
-        10: 2,  # 'k'
-        5: 3,  # 'l'
-        13: 3,  # 'm'
-        4: 3,  # 'n'
-        15: 1,  # 'o'
-        26: 2,  # 'p'
-        7: 3,  # 'r'
-        8: 2,  # 's'
-        9: 2,  # 't'
-        14: 3,  # 'u'
-        32: 1,  # 'v'
-        57: 0,  # 'w'
-        58: 1,  # 'x'
-        11: 3,  # 'y'
-        22: 1,  # 'z'
-        63: 1,  # '·'
-        54: 0,  # 'Ç'
-        50: 0,  # 'Ö'
-        55: 0,  # 'Ü'
-        59: 0,  # 'â'
-        33: 0,  # 'ç'
-        61: 0,  # 'î'
-        34: 0,  # 'ö'
-        17: 1,  # 'ü'
-        30: 0,  # 'ÄŸ'
-        41: 0,  # 'İ'
-        6: 2,  # 'ı'
-        40: 0,  # 'Åž'
-        19: 0,  # 'ÅŸ'
-    },
-    2: {  # 'e'
-        23: 2,  # 'A'
-        37: 0,  # 'B'
-        47: 2,  # 'C'
-        39: 0,  # 'D'
-        29: 3,  # 'E'
-        52: 1,  # 'F'
-        36: 0,  # 'G'
-        45: 0,  # 'H'
-        53: 0,  # 'I'
-        60: 0,  # 'J'
-        16: 1,  # 'K'
-        49: 0,  # 'L'
-        20: 3,  # 'M'
-        46: 1,  # 'N'
-        42: 0,  # 'O'
-        48: 1,  # 'P'
-        44: 1,  # 'R'
-        35: 0,  # 'S'
-        31: 3,  # 'T'
-        51: 0,  # 'U'
-        38: 1,  # 'V'
-        62: 0,  # 'W'
-        43: 1,  # 'Y'
-        56: 0,  # 'Z'
-        1: 3,  # 'a'
-        21: 3,  # 'b'
-        28: 0,  # 'c'
-        12: 3,  # 'd'
-        2: 2,  # 'e'
-        18: 3,  # 'f'
-        27: 3,  # 'g'
-        25: 3,  # 'h'
-        3: 3,  # 'i'
-        24: 3,  # 'j'
-        10: 3,  # 'k'
-        5: 0,  # 'l'
-        13: 2,  # 'm'
-        4: 3,  # 'n'
-        15: 1,  # 'o'
-        26: 3,  # 'p'
-        7: 3,  # 'r'
-        8: 3,  # 's'
-        9: 3,  # 't'
-        14: 3,  # 'u'
-        32: 3,  # 'v'
-        57: 2,  # 'w'
-        58: 0,  # 'x'
-        11: 3,  # 'y'
-        22: 1,  # 'z'
-        63: 1,  # '·'
-        54: 0,  # 'Ç'
-        50: 0,  # 'Ö'
-        55: 0,  # 'Ü'
-        59: 0,  # 'â'
-        33: 1,  # 'ç'
-        61: 0,  # 'î'
-        34: 1,  # 'ö'
-        17: 3,  # 'ü'
-        30: 0,  # 'ÄŸ'
-        41: 0,  # 'İ'
-        6: 3,  # 'ı'
-        40: 0,  # 'Åž'
-        19: 0,  # 'ÅŸ'
-    },
-    18: {  # 'f'
-        23: 0,  # 'A'
-        37: 0,  # 'B'
-        47: 0,  # 'C'
-        39: 0,  # 'D'
-        29: 0,  # 'E'
-        52: 0,  # 'F'
-        36: 0,  # 'G'
-        45: 0,  # 'H'
-        53: 0,  # 'I'
-        60: 0,  # 'J'
-        16: 2,  # 'K'
-        49: 0,  # 'L'
-        20: 2,  # 'M'
-        46: 0,  # 'N'
-        42: 0,  # 'O'
-        48: 0,  # 'P'
-        44: 0,  # 'R'
-        35: 0,  # 'S'
-        31: 2,  # 'T'
-        51: 0,  # 'U'
-        38: 0,  # 'V'
-        62: 0,  # 'W'
-        43: 0,  # 'Y'
-        56: 0,  # 'Z'
-        1: 3,  # 'a'
-        21: 1,  # 'b'
-        28: 0,  # 'c'
-        12: 3,  # 'd'
-        2: 3,  # 'e'
-        18: 2,  # 'f'
-        27: 1,  # 'g'
-        25: 1,  # 'h'
-        3: 1,  # 'i'
-        24: 1,  # 'j'
-        10: 1,  # 'k'
-        5: 3,  # 'l'
-        13: 3,  # 'm'
-        4: 3,  # 'n'
-        15: 0,  # 'o'
-        26: 2,  # 'p'
-        7: 1,  # 'r'
-        8: 3,  # 's'
-        9: 3,  # 't'
-        14: 1,  # 'u'
-        32: 2,  # 'v'
-        57: 0,  # 'w'
-        58: 0,  # 'x'
-        11: 1,  # 'y'
-        22: 0,  # 'z'
-        63: 0,  # '·'
-        54: 0,  # 'Ç'
-        50: 0,  # 'Ö'
-        55: 0,  # 'Ü'
-        59: 0,  # 'â'
-        33: 1,  # 'ç'
-        61: 0,  # 'î'
-        34: 0,  # 'ö'
-        17: 1,  # 'ü'
-        30: 0,  # 'ÄŸ'
-        41: 0,  # 'İ'
-        6: 1,  # 'ı'
-        40: 0,  # 'Åž'
-        19: 0,  # 'ÅŸ'
-    },
-    27: {  # 'g'
-        23: 0,  # 'A'
-        37: 0,  # 'B'
-        47: 0,  # 'C'
-        39: 0,  # 'D'
-        29: 0,  # 'E'
-        52: 0,  # 'F'
-        36: 0,  # 'G'
-        45: 0,  # 'H'
-        53: 0,  # 'I'
-        60: 0,  # 'J'
-        16: 3,  # 'K'
-        49: 0,  # 'L'
-        20: 0,  # 'M'
-        46: 0,  # 'N'
-        42: 0,  # 'O'
-        48: 0,  # 'P'
-        44: 0,  # 'R'
-        35: 1,  # 'S'
-        31: 1,  # 'T'
-        51: 0,  # 'U'
-        38: 2,  # 'V'
-        62: 0,  # 'W'
-        43: 0,  # 'Y'
-        56: 0,  # 'Z'
-        1: 3,  # 'a'
-        21: 1,  # 'b'
-        28: 0,  # 'c'
-        12: 1,  # 'd'
-        2: 3,  # 'e'
-        18: 0,  # 'f'
-        27: 2,  # 'g'
-        25: 1,  # 'h'
-        3: 2,  # 'i'
-        24: 3,  # 'j'
-        10: 2,  # 'k'
-        5: 3,  # 'l'
-        13: 3,  # 'm'
-        4: 2,  # 'n'
-        15: 0,  # 'o'
-        26: 1,  # 'p'
-        7: 2,  # 'r'
-        8: 2,  # 's'
-        9: 3,  # 't'
-        14: 3,  # 'u'
-        32: 1,  # 'v'
-        57: 0,  # 'w'
-        58: 0,  # 'x'
-        11: 1,  # 'y'
-        22: 0,  # 'z'
-        63: 1,  # '·'
-        54: 0,  # 'Ç'
-        50: 0,  # 'Ö'
-        55: 0,  # 'Ü'
-        59: 0,  # 'â'
-        33: 0,  # 'ç'
-        61: 0,  # 'î'
-        34: 0,  # 'ö'
-        17: 0,  # 'ü'
-        30: 0,  # 'ÄŸ'
-        41: 0,  # 'İ'
-        6: 2,  # 'ı'
-        40: 0,  # 'Åž'
-        19: 0,  # 'ÅŸ'
-    },
-    25: {  # 'h'
-        23: 0,  # 'A'
-        37: 0,  # 'B'
-        47: 0,  # 'C'
-        39: 0,  # 'D'
-        29: 0,  # 'E'
-        52: 0,  # 'F'
-        36: 0,  # 'G'
-        45: 0,  # 'H'
-        53: 0,  # 'I'
-        60: 0,  # 'J'
-        16: 2,  # 'K'
-        49: 0,  # 'L'
-        20: 0,  # 'M'
-        46: 0,  # 'N'
-        42: 0,  # 'O'
-        48: 0,  # 'P'
-        44: 0,  # 'R'
-        35: 0,  # 'S'
-        31: 0,  # 'T'
-        51: 0,  # 'U'
-        38: 0,  # 'V'
-        62: 0,  # 'W'
-        43: 0,  # 'Y'
-        56: 0,  # 'Z'
-        1: 3,  # 'a'
-        21: 0,  # 'b'
-        28: 0,  # 'c'
-        12: 2,  # 'd'
-        2: 3,  # 'e'
-        18: 0,  # 'f'
-        27: 1,  # 'g'
-        25: 2,  # 'h'
-        3: 2,  # 'i'
-        24: 3,  # 'j'
-        10: 3,  # 'k'
-        5: 3,  # 'l'
-        13: 3,  # 'm'
-        4: 3,  # 'n'
-        15: 1,  # 'o'
-        26: 1,  # 'p'
-        7: 3,  # 'r'
-        8: 3,  # 's'
-        9: 2,  # 't'
-        14: 3,  # 'u'
-        32: 2,  # 'v'
-        57: 1,  # 'w'
-        58: 0,  # 'x'
-        11: 1,  # 'y'
-        22: 0,  # 'z'
-        63: 0,  # '·'
-        54: 0,  # 'Ç'
-        50: 0,  # 'Ö'
-        55: 0,  # 'Ü'
-        59: 0,  # 'â'
-        33: 0,  # 'ç'
-        61: 0,  # 'î'
-        34: 0,  # 'ö'
-        17: 0,  # 'ü'
-        30: 0,  # 'ÄŸ'
-        41: 0,  # 'İ'
-        6: 3,  # 'ı'
-        40: 0,  # 'Åž'
-        19: 0,  # 'ÅŸ'
-    },
-    3: {  # 'i'
-        23: 2,  # 'A'
-        37: 0,  # 'B'
-        47: 0,  # 'C'
-        39: 0,  # 'D'
-        29: 0,  # 'E'
-        52: 0,  # 'F'
-        36: 0,  # 'G'
-        45: 0,  # 'H'
-        53: 0,  # 'I'
-        60: 1,  # 'J'
-        16: 3,  # 'K'
-        49: 0,  # 'L'
-        20: 3,  # 'M'
-        46: 0,  # 'N'
-        42: 1,  # 'O'
-        48: 0,  # 'P'
-        44: 0,  # 'R'
-        35: 1,  # 'S'
-        31: 2,  # 'T'
-        51: 0,  # 'U'
-        38: 1,  # 'V'
-        62: 0,  # 'W'
-        43: 0,  # 'Y'
-        56: 0,  # 'Z'
-        1: 3,  # 'a'
-        21: 2,  # 'b'
-        28: 0,  # 'c'
-        12: 3,  # 'd'
-        2: 3,  # 'e'
-        18: 2,  # 'f'
-        27: 3,  # 'g'
-        25: 1,  # 'h'
-        3: 3,  # 'i'
-        24: 2,  # 'j'
-        10: 3,  # 'k'
-        5: 3,  # 'l'
-        13: 3,  # 'm'
-        4: 3,  # 'n'
-        15: 1,  # 'o'
-        26: 3,  # 'p'
-        7: 3,  # 'r'
-        8: 3,  # 's'
-        9: 3,  # 't'
-        14: 3,  # 'u'
-        32: 2,  # 'v'
-        57: 1,  # 'w'
-        58: 1,  # 'x'
-        11: 3,  # 'y'
-        22: 1,  # 'z'
-        63: 1,  # '·'
-        54: 0,  # 'Ç'
-        50: 0,  # 'Ö'
-        55: 1,  # 'Ü'
-        59: 0,  # 'â'
-        33: 2,  # 'ç'
-        61: 0,  # 'î'
-        34: 0,  # 'ö'
-        17: 3,  # 'ü'
-        30: 0,  # 'ÄŸ'
-        41: 1,  # 'İ'
-        6: 2,  # 'ı'
-        40: 0,  # 'Åž'
-        19: 0,  # 'ÅŸ'
-    },
-    24: {  # 'j'
-        23: 0,  # 'A'
-        37: 0,  # 'B'
-        47: 0,  # 'C'
-        39: 0,  # 'D'
-        29: 0,  # 'E'
-        52: 0,  # 'F'
-        36: 0,  # 'G'
-        45: 0,  # 'H'
-        53: 0,  # 'I'
-        60: 1,  # 'J'
-        16: 2,  # 'K'
-        49: 0,  # 'L'
-        20: 2,  # 'M'
-        46: 0,  # 'N'
-        42: 0,  # 'O'
-        48: 1,  # 'P'
-        44: 0,  # 'R'
-        35: 0,  # 'S'
-        31: 1,  # 'T'
-        51: 0,  # 'U'
-        38: 0,  # 'V'
-        62: 0,  # 'W'
-        43: 0,  # 'Y'
-        56: 1,  # 'Z'
-        1: 3,  # 'a'
-        21: 1,  # 'b'
-        28: 1,  # 'c'
-        12: 3,  # 'd'
-        2: 3,  # 'e'
-        18: 2,  # 'f'
-        27: 1,  # 'g'
-        25: 1,  # 'h'
-        3: 2,  # 'i'
-        24: 1,  # 'j'
-        10: 2,  # 'k'
-        5: 2,  # 'l'
-        13: 3,  # 'm'
-        4: 2,  # 'n'
-        15: 0,  # 'o'
-        26: 1,  # 'p'
-        7: 2,  # 'r'
-        8: 3,  # 's'
-        9: 2,  # 't'
-        14: 3,  # 'u'
-        32: 2,  # 'v'
-        57: 0,  # 'w'
-        58: 2,  # 'x'
-        11: 1,  # 'y'
-        22: 0,  # 'z'
-        63: 0,  # '·'
-        54: 0,  # 'Ç'
-        50: 0,  # 'Ö'
-        55: 0,  # 'Ü'
-        59: 0,  # 'â'
-        33: 1,  # 'ç'
-        61: 0,  # 'î'
-        34: 0,  # 'ö'
-        17: 1,  # 'ü'
-        30: 0,  # 'ÄŸ'
-        41: 0,  # 'İ'
-        6: 3,  # 'ı'
-        40: 0,  # 'Åž'
-        19: 0,  # 'ÅŸ'
-    },
-    10: {  # 'k'
-        23: 0,  # 'A'
-        37: 0,  # 'B'
-        47: 0,  # 'C'
-        39: 0,  # 'D'
-        29: 0,  # 'E'
-        52: 0,  # 'F'
-        36: 0,  # 'G'
-        45: 0,  # 'H'
-        53: 0,  # 'I'
-        60: 0,  # 'J'
-        16: 3,  # 'K'
-        49: 0,  # 'L'
-        20: 2,  # 'M'
-        46: 0,  # 'N'
-        42: 0,  # 'O'
-        48: 0,  # 'P'
-        44: 0,  # 'R'
-        35: 0,  # 'S'
-        31: 3,  # 'T'
-        51: 0,  # 'U'
-        38: 1,  # 'V'
-        62: 0,  # 'W'
-        43: 0,  # 'Y'
-        56: 1,  # 'Z'
-        1: 3,  # 'a'
-        21: 2,  # 'b'
-        28: 0,  # 'c'
-        12: 2,  # 'd'
-        2: 3,  # 'e'
-        18: 1,  # 'f'
-        27: 2,  # 'g'
-        25: 2,  # 'h'
-        3: 3,  # 'i'
-        24: 2,  # 'j'
-        10: 2,  # 'k'
-        5: 3,  # 'l'
-        13: 3,  # 'm'
-        4: 3,  # 'n'
-        15: 0,  # 'o'
-        26: 3,  # 'p'
-        7: 2,  # 'r'
-        8: 2,  # 's'
-        9: 2,  # 't'
-        14: 3,  # 'u'
-        32: 0,  # 'v'
-        57: 0,  # 'w'
-        58: 1,  # 'x'
-        11: 3,  # 'y'
-        22: 0,  # 'z'
-        63: 1,  # '·'
-        54: 0,  # 'Ç'
-        50: 0,  # 'Ö'
-        55: 0,  # 'Ü'
-        59: 0,  # 'â'
-        33: 3,  # 'ç'
-        61: 0,  # 'î'
-        34: 1,  # 'ö'
-        17: 3,  # 'ü'
-        30: 1,  # 'ÄŸ'
-        41: 0,  # 'İ'
-        6: 3,  # 'ı'
-        40: 0,  # 'Åž'
-        19: 1,  # 'ÅŸ'
-    },
-    5: {  # 'l'
-        23: 0,  # 'A'
-        37: 0,  # 'B'
-        47: 0,  # 'C'
-        39: 0,  # 'D'
-        29: 3,  # 'E'
-        52: 0,  # 'F'
-        36: 0,  # 'G'
-        45: 0,  # 'H'
-        53: 0,  # 'I'
-        60: 0,  # 'J'
-        16: 0,  # 'K'
-        49: 0,  # 'L'
-        20: 2,  # 'M'
-        46: 0,  # 'N'
-        42: 0,  # 'O'
-        48: 0,  # 'P'
-        44: 0,  # 'R'
-        35: 0,  # 'S'
-        31: 1,  # 'T'
-        51: 0,  # 'U'
-        38: 0,  # 'V'
-        62: 0,  # 'W'
-        43: 0,  # 'Y'
-        56: 0,  # 'Z'
-        1: 0,  # 'a'
-        21: 3,  # 'b'
-        28: 0,  # 'c'
-        12: 3,  # 'd'
-        2: 1,  # 'e'
-        18: 3,  # 'f'
-        27: 3,  # 'g'
-        25: 2,  # 'h'
-        3: 3,  # 'i'
-        24: 2,  # 'j'
-        10: 3,  # 'k'
-        5: 1,  # 'l'
-        13: 1,  # 'm'
-        4: 3,  # 'n'
-        15: 0,  # 'o'
-        26: 2,  # 'p'
-        7: 3,  # 'r'
-        8: 3,  # 's'
-        9: 3,  # 't'
-        14: 2,  # 'u'
-        32: 2,  # 'v'
-        57: 0,  # 'w'
-        58: 0,  # 'x'
-        11: 3,  # 'y'
-        22: 0,  # 'z'
-        63: 0,  # '·'
-        54: 0,  # 'Ç'
-        50: 0,  # 'Ö'
-        55: 0,  # 'Ü'
-        59: 0,  # 'â'
-        33: 1,  # 'ç'
-        61: 0,  # 'î'
-        34: 0,  # 'ö'
-        17: 2,  # 'ü'
-        30: 0,  # 'ÄŸ'
-        41: 0,  # 'İ'
-        6: 3,  # 'ı'
-        40: 0,  # 'Åž'
-        19: 0,  # 'ÅŸ'
-    },
-    13: {  # 'm'
-        23: 1,  # 'A'
-        37: 0,  # 'B'
-        47: 0,  # 'C'
-        39: 0,  # 'D'
-        29: 3,  # 'E'
-        52: 0,  # 'F'
-        36: 0,  # 'G'
-        45: 0,  # 'H'
-        53: 0,  # 'I'
-        60: 0,  # 'J'
-        16: 0,  # 'K'
-        49: 0,  # 'L'
-        20: 3,  # 'M'
-        46: 0,  # 'N'
-        42: 0,  # 'O'
-        48: 0,  # 'P'
-        44: 0,  # 'R'
-        35: 0,  # 'S'
-        31: 3,  # 'T'
-        51: 0,  # 'U'
-        38: 0,  # 'V'
-        62: 0,  # 'W'
-        43: 1,  # 'Y'
-        56: 0,  # 'Z'
-        1: 2,  # 'a'
-        21: 3,  # 'b'
-        28: 0,  # 'c'
-        12: 3,  # 'd'
-        2: 2,  # 'e'
-        18: 3,  # 'f'
-        27: 3,  # 'g'
-        25: 3,  # 'h'
-        3: 3,  # 'i'
-        24: 3,  # 'j'
-        10: 3,  # 'k'
-        5: 0,  # 'l'
-        13: 2,  # 'm'
-        4: 3,  # 'n'
-        15: 1,  # 'o'
-        26: 2,  # 'p'
-        7: 3,  # 'r'
-        8: 3,  # 's'
-        9: 3,  # 't'
-        14: 2,  # 'u'
-        32: 2,  # 'v'
-        57: 1,  # 'w'
-        58: 0,  # 'x'
-        11: 3,  # 'y'
-        22: 0,  # 'z'
-        63: 0,  # '·'
-        54: 0,  # 'Ç'
-        50: 0,  # 'Ö'
-        55: 0,  # 'Ü'
-        59: 0,  # 'â'
-        33: 0,  # 'ç'
-        61: 0,  # 'î'
-        34: 0,  # 'ö'
-        17: 3,  # 'ü'
-        30: 0,  # 'ÄŸ'
-        41: 0,  # 'İ'
-        6: 3,  # 'ı'
-        40: 0,  # 'Åž'
-        19: 1,  # 'ÅŸ'
-    },
-    4: {  # 'n'
-        23: 1,  # 'A'
-        37: 0,  # 'B'
-        47: 0,  # 'C'
-        39: 0,  # 'D'
-        29: 0,  # 'E'
-        52: 0,  # 'F'
-        36: 0,  # 'G'
-        45: 1,  # 'H'
-        53: 0,  # 'I'
-        60: 2,  # 'J'
-        16: 3,  # 'K'
-        49: 0,  # 'L'
-        20: 3,  # 'M'
-        46: 0,  # 'N'
-        42: 0,  # 'O'
-        48: 0,  # 'P'
-        44: 0,  # 'R'
-        35: 0,  # 'S'
-        31: 2,  # 'T'
-        51: 0,  # 'U'
-        38: 0,  # 'V'
-        62: 0,  # 'W'
-        43: 0,  # 'Y'
-        56: 0,  # 'Z'
-        1: 3,  # 'a'
-        21: 2,  # 'b'
-        28: 1,  # 'c'
-        12: 3,  # 'd'
-        2: 3,  # 'e'
-        18: 1,  # 'f'
-        27: 2,  # 'g'
-        25: 3,  # 'h'
-        3: 2,  # 'i'
-        24: 2,  # 'j'
-        10: 3,  # 'k'
-        5: 3,  # 'l'
-        13: 3,  # 'm'
-        4: 3,  # 'n'
-        15: 1,  # 'o'
-        26: 3,  # 'p'
-        7: 2,  # 'r'
-        8: 3,  # 's'
-        9: 3,  # 't'
-        14: 3,  # 'u'
-        32: 2,  # 'v'
-        57: 0,  # 'w'
-        58: 2,  # 'x'
-        11: 3,  # 'y'
-        22: 0,  # 'z'
-        63: 0,  # '·'
-        54: 0,  # 'Ç'
-        50: 0,  # 'Ö'
-        55: 0,  # 'Ü'
-        59: 0,  # 'â'
-        33: 1,  # 'ç'
-        61: 0,  # 'î'
-        34: 0,  # 'ö'
-        17: 2,  # 'ü'
-        30: 0,  # 'ÄŸ'
-        41: 0,  # 'İ'
-        6: 1,  # 'ı'
-        40: 0,  # 'Åž'
-        19: 0,  # 'ÅŸ'
-    },
-    15: {  # 'o'
-        23: 0,  # 'A'
-        37: 0,  # 'B'
-        47: 1,  # 'C'
-        39: 0,  # 'D'
-        29: 0,  # 'E'
-        52: 2,  # 'F'
-        36: 1,  # 'G'
-        45: 1,  # 'H'
-        53: 1,  # 'I'
-        60: 0,  # 'J'
-        16: 3,  # 'K'
-        49: 2,  # 'L'
-        20: 0,  # 'M'
-        46: 2,  # 'N'
-        42: 1,  # 'O'
-        48: 2,  # 'P'
-        44: 1,  # 'R'
-        35: 0,  # 'S'
-        31: 0,  # 'T'
-        51: 0,  # 'U'
-        38: 0,  # 'V'
-        62: 0,  # 'W'
-        43: 0,  # 'Y'
-        56: 0,  # 'Z'
-        1: 3,  # 'a'
-        21: 0,  # 'b'
-        28: 2,  # 'c'
-        12: 0,  # 'd'
-        2: 3,  # 'e'
-        18: 0,  # 'f'
-        27: 0,  # 'g'
-        25: 0,  # 'h'
-        3: 1,  # 'i'
-        24: 2,  # 'j'
-        10: 1,  # 'k'
-        5: 3,  # 'l'
-        13: 3,  # 'm'
-        4: 2,  # 'n'
-        15: 2,  # 'o'
-        26: 0,  # 'p'
-        7: 1,  # 'r'
-        8: 0,  # 's'
-        9: 0,  # 't'
-        14: 3,  # 'u'
-        32: 0,  # 'v'
-        57: 0,  # 'w'
-        58: 2,  # 'x'
-        11: 0,  # 'y'
-        22: 2,  # 'z'
-        63: 0,  # '·'
-        54: 1,  # 'Ç'
-        50: 2,  # 'Ö'
-        55: 0,  # 'Ü'
-        59: 0,  # 'â'
-        33: 3,  # 'ç'
-        61: 0,  # 'î'
-        34: 1,  # 'ö'
-        17: 0,  # 'ü'
-        30: 2,  # 'ÄŸ'
-        41: 2,  # 'İ'
-        6: 3,  # 'ı'
-        40: 2,  # 'Åž'
-        19: 2,  # 'ÅŸ'
-    },
-    26: {  # 'p'
-        23: 0,  # 'A'
-        37: 0,  # 'B'
-        47: 0,  # 'C'
-        39: 0,  # 'D'
-        29: 0,  # 'E'
-        52: 0,  # 'F'
-        36: 0,  # 'G'
-        45: 0,  # 'H'
-        53: 0,  # 'I'
-        60: 0,  # 'J'
-        16: 3,  # 'K'
-        49: 0,  # 'L'
-        20: 1,  # 'M'
-        46: 0,  # 'N'
-        42: 0,  # 'O'
-        48: 0,  # 'P'
-        44: 0,  # 'R'
-        35: 0,  # 'S'
-        31: 0,  # 'T'
-        51: 0,  # 'U'
-        38: 0,  # 'V'
-        62: 0,  # 'W'
-        43: 0,  # 'Y'
-        56: 0,  # 'Z'
-        1: 3,  # 'a'
-        21: 1,  # 'b'
-        28: 0,  # 'c'
-        12: 1,  # 'd'
-        2: 3,  # 'e'
-        18: 0,  # 'f'
-        27: 1,  # 'g'
-        25: 1,  # 'h'
-        3: 2,  # 'i'
-        24: 3,  # 'j'
-        10: 1,  # 'k'
-        5: 3,  # 'l'
-        13: 3,  # 'm'
-        4: 2,  # 'n'
-        15: 0,  # 'o'
-        26: 2,  # 'p'
-        7: 2,  # 'r'
-        8: 1,  # 's'
-        9: 1,  # 't'
-        14: 3,  # 'u'
-        32: 0,  # 'v'
-        57: 0,  # 'w'
-        58: 1,  # 'x'
-        11: 1,  # 'y'
-        22: 0,  # 'z'
-        63: 0,  # '·'
-        54: 0,  # 'Ç'
-        50: 0,  # 'Ö'
-        55: 0,  # 'Ü'
-        59: 0,  # 'â'
-        33: 3,  # 'ç'
-        61: 0,  # 'î'
-        34: 0,  # 'ö'
-        17: 1,  # 'ü'
-        30: 0,  # 'ÄŸ'
-        41: 0,  # 'İ'
-        6: 3,  # 'ı'
-        40: 0,  # 'Åž'
-        19: 0,  # 'ÅŸ'
-    },
-    7: {  # 'r'
-        23: 0,  # 'A'
-        37: 0,  # 'B'
-        47: 0,  # 'C'
-        39: 0,  # 'D'
-        29: 0,  # 'E'
-        52: 1,  # 'F'
-        36: 0,  # 'G'
-        45: 0,  # 'H'
-        53: 0,  # 'I'
-        60: 2,  # 'J'
-        16: 3,  # 'K'
-        49: 0,  # 'L'
-        20: 2,  # 'M'
-        46: 0,  # 'N'
-        42: 0,  # 'O'
-        48: 0,  # 'P'
-        44: 0,  # 'R'
-        35: 0,  # 'S'
-        31: 2,  # 'T'
-        51: 1,  # 'U'
-        38: 0,  # 'V'
-        62: 0,  # 'W'
-        43: 0,  # 'Y'
-        56: 1,  # 'Z'
-        1: 3,  # 'a'
-        21: 1,  # 'b'
-        28: 0,  # 'c'
-        12: 3,  # 'd'
-        2: 3,  # 'e'
-        18: 0,  # 'f'
-        27: 2,  # 'g'
-        25: 3,  # 'h'
-        3: 2,  # 'i'
-        24: 2,  # 'j'
-        10: 3,  # 'k'
-        5: 3,  # 'l'
-        13: 3,  # 'm'
-        4: 3,  # 'n'
-        15: 0,  # 'o'
-        26: 2,  # 'p'
-        7: 3,  # 'r'
-        8: 3,  # 's'
-        9: 3,  # 't'
-        14: 3,  # 'u'
-        32: 2,  # 'v'
-        57: 0,  # 'w'
-        58: 1,  # 'x'
-        11: 2,  # 'y'
-        22: 0,  # 'z'
-        63: 1,  # '·'
-        54: 0,  # 'Ç'
-        50: 0,  # 'Ö'
-        55: 0,  # 'Ü'
-        59: 0,  # 'â'
-        33: 2,  # 'ç'
-        61: 0,  # 'î'
-        34: 0,  # 'ö'
-        17: 3,  # 'ü'
-        30: 0,  # 'ÄŸ'
-        41: 0,  # 'İ'
-        6: 2,  # 'ı'
-        40: 0,  # 'Åž'
-        19: 0,  # 'ÅŸ'
-    },
-    8: {  # 's'
-        23: 1,  # 'A'
-        37: 0,  # 'B'
-        47: 0,  # 'C'
-        39: 0,  # 'D'
-        29: 0,  # 'E'
-        52: 0,  # 'F'
-        36: 1,  # 'G'
-        45: 0,  # 'H'
-        53: 0,  # 'I'
-        60: 0,  # 'J'
-        16: 3,  # 'K'
-        49: 0,  # 'L'
-        20: 3,  # 'M'
-        46: 0,  # 'N'
-        42: 0,  # 'O'
-        48: 0,  # 'P'
-        44: 0,  # 'R'
-        35: 0,  # 'S'
-        31: 2,  # 'T'
-        51: 0,  # 'U'
-        38: 0,  # 'V'
-        62: 0,  # 'W'
-        43: 0,  # 'Y'
-        56: 1,  # 'Z'
-        1: 3,  # 'a'
-        21: 2,  # 'b'
-        28: 1,  # 'c'
-        12: 3,  # 'd'
-        2: 3,  # 'e'
-        18: 0,  # 'f'
-        27: 2,  # 'g'
-        25: 2,  # 'h'
-        3: 2,  # 'i'
-        24: 3,  # 'j'
-        10: 3,  # 'k'
-        5: 3,  # 'l'
-        13: 3,  # 'm'
-        4: 3,  # 'n'
-        15: 0,  # 'o'
-        26: 3,  # 'p'
-        7: 3,  # 'r'
-        8: 3,  # 's'
-        9: 3,  # 't'
-        14: 3,  # 'u'
-        32: 2,  # 'v'
-        57: 0,  # 'w'
-        58: 1,  # 'x'
-        11: 2,  # 'y'
-        22: 1,  # 'z'
-        63: 0,  # '·'
-        54: 0,  # 'Ç'
-        50: 0,  # 'Ö'
-        55: 0,  # 'Ü'
-        59: 0,  # 'â'
-        33: 2,  # 'ç'
-        61: 0,  # 'î'
-        34: 0,  # 'ö'
-        17: 2,  # 'ü'
-        30: 0,  # 'ÄŸ'
-        41: 0,  # 'İ'
-        6: 3,  # 'ı'
-        40: 0,  # 'Åž'
-        19: 1,  # 'ÅŸ'
-    },
-    9: {  # 't'
-        23: 0,  # 'A'
-        37: 0,  # 'B'
-        47: 0,  # 'C'
-        39: 0,  # 'D'
-        29: 0,  # 'E'
-        52: 0,  # 'F'
-        36: 0,  # 'G'
-        45: 0,  # 'H'
-        53: 0,  # 'I'
-        60: 1,  # 'J'
-        16: 3,  # 'K'
-        49: 0,  # 'L'
-        20: 2,  # 'M'
-        46: 0,  # 'N'
-        42: 0,  # 'O'
-        48: 0,  # 'P'
-        44: 0,  # 'R'
-        35: 0,  # 'S'
-        31: 2,  # 'T'
-        51: 0,  # 'U'
-        38: 0,  # 'V'
-        62: 0,  # 'W'
-        43: 0,  # 'Y'
-        56: 1,  # 'Z'
-        1: 3,  # 'a'
-        21: 3,  # 'b'
-        28: 0,  # 'c'
-        12: 3,  # 'd'
-        2: 3,  # 'e'
-        18: 2,  # 'f'
-        27: 2,  # 'g'
-        25: 2,  # 'h'
-        3: 2,  # 'i'
-        24: 2,  # 'j'
-        10: 3,  # 'k'
-        5: 3,  # 'l'
-        13: 3,  # 'm'
-        4: 3,  # 'n'
-        15: 0,  # 'o'
-        26: 2,  # 'p'
-        7: 3,  # 'r'
-        8: 3,  # 's'
-        9: 3,  # 't'
-        14: 3,  # 'u'
-        32: 3,  # 'v'
-        57: 0,  # 'w'
-        58: 2,  # 'x'
-        11: 2,  # 'y'
-        22: 0,  # 'z'
-        63: 0,  # '·'
-        54: 0,  # 'Ç'
-        50: 0,  # 'Ö'
-        55: 0,  # 'Ü'
-        59: 0,  # 'â'
-        33: 3,  # 'ç'
-        61: 0,  # 'î'
-        34: 0,  # 'ö'
-        17: 2,  # 'ü'
-        30: 0,  # 'ÄŸ'
-        41: 0,  # 'İ'
-        6: 3,  # 'ı'
-        40: 0,  # 'Åž'
-        19: 0,  # 'ÅŸ'
-    },
-    14: {  # 'u'
-        23: 3,  # 'A'
-        37: 0,  # 'B'
-        47: 0,  # 'C'
-        39: 0,  # 'D'
-        29: 3,  # 'E'
-        52: 0,  # 'F'
-        36: 0,  # 'G'
-        45: 1,  # 'H'
-        53: 0,  # 'I'
-        60: 1,  # 'J'
-        16: 0,  # 'K'
-        49: 0,  # 'L'
-        20: 3,  # 'M'
-        46: 2,  # 'N'
-        42: 0,  # 'O'
-        48: 1,  # 'P'
-        44: 0,  # 'R'
-        35: 0,  # 'S'
-        31: 3,  # 'T'
-        51: 0,  # 'U'
-        38: 0,  # 'V'
-        62: 0,  # 'W'
-        43: 1,  # 'Y'
-        56: 2,  # 'Z'
-        1: 2,  # 'a'
-        21: 3,  # 'b'
-        28: 0,  # 'c'
-        12: 3,  # 'd'
-        2: 2,  # 'e'
-        18: 2,  # 'f'
-        27: 3,  # 'g'
-        25: 3,  # 'h'
-        3: 3,  # 'i'
-        24: 2,  # 'j'
-        10: 3,  # 'k'
-        5: 0,  # 'l'
-        13: 3,  # 'm'
-        4: 3,  # 'n'
-        15: 0,  # 'o'
-        26: 3,  # 'p'
-        7: 3,  # 'r'
-        8: 3,  # 's'
-        9: 3,  # 't'
-        14: 3,  # 'u'
-        32: 2,  # 'v'
-        57: 2,  # 'w'
-        58: 0,  # 'x'
-        11: 3,  # 'y'
-        22: 0,  # 'z'
-        63: 1,  # '·'
-        54: 0,  # 'Ç'
-        50: 0,  # 'Ö'
-        55: 0,  # 'Ü'
-        59: 0,  # 'â'
-        33: 0,  # 'ç'
-        61: 0,  # 'î'
-        34: 0,  # 'ö'
-        17: 3,  # 'ü'
-        30: 1,  # 'ÄŸ'
-        41: 0,  # 'İ'
-        6: 3,  # 'ı'
-        40: 0,  # 'Åž'
-        19: 0,  # 'ÅŸ'
-    },
-    32: {  # 'v'
-        23: 0,  # 'A'
-        37: 0,  # 'B'
-        47: 0,  # 'C'
-        39: 0,  # 'D'
-        29: 0,  # 'E'
-        52: 0,  # 'F'
-        36: 0,  # 'G'
-        45: 0,  # 'H'
-        53: 0,  # 'I'
-        60: 0,  # 'J'
-        16: 3,  # 'K'
-        49: 0,  # 'L'
-        20: 1,  # 'M'
-        46: 0,  # 'N'
-        42: 0,  # 'O'
-        48: 0,  # 'P'
-        44: 0,  # 'R'
-        35: 0,  # 'S'
-        31: 0,  # 'T'
-        51: 0,  # 'U'
-        38: 0,  # 'V'
-        62: 0,  # 'W'
-        43: 0,  # 'Y'
-        56: 0,  # 'Z'
-        1: 3,  # 'a'
-        21: 0,  # 'b'
-        28: 0,  # 'c'
-        12: 3,  # 'd'
-        2: 3,  # 'e'
-        18: 0,  # 'f'
-        27: 0,  # 'g'
-        25: 0,  # 'h'
-        3: 0,  # 'i'
-        24: 1,  # 'j'
-        10: 1,  # 'k'
-        5: 3,  # 'l'
-        13: 2,  # 'm'
-        4: 3,  # 'n'
-        15: 0,  # 'o'
-        26: 1,  # 'p'
-        7: 1,  # 'r'
-        8: 2,  # 's'
-        9: 3,  # 't'
-        14: 3,  # 'u'
-        32: 1,  # 'v'
-        57: 0,  # 'w'
-        58: 0,  # 'x'
-        11: 0,  # 'y'
-        22: 0,  # 'z'
-        63: 0,  # '·'
-        54: 0,  # 'Ç'
-        50: 0,  # 'Ö'
-        55: 0,  # 'Ü'
-        59: 0,  # 'â'
-        33: 2,  # 'ç'
-        61: 0,  # 'î'
-        34: 0,  # 'ö'
-        17: 0,  # 'ü'
-        30: 0,  # 'ÄŸ'
-        41: 0,  # 'İ'
-        6: 1,  # 'ı'
-        40: 0,  # 'Åž'
-        19: 0,  # 'ÅŸ'
-    },
-    57: {  # 'w'
-        23: 0,  # 'A'
-        37: 0,  # 'B'
-        47: 0,  # 'C'
-        39: 0,  # 'D'
-        29: 0,  # 'E'
-        52: 0,  # 'F'
-        36: 0,  # 'G'
-        45: 0,  # 'H'
-        53: 0,  # 'I'
-        60: 0,  # 'J'
-        16: 0,  # 'K'
-        49: 0,  # 'L'
-        20: 0,  # 'M'
-        46: 0,  # 'N'
-        42: 0,  # 'O'
-        48: 0,  # 'P'
-        44: 0,  # 'R'
-        35: 0,  # 'S'
-        31: 0,  # 'T'
-        51: 1,  # 'U'
-        38: 0,  # 'V'
-        62: 0,  # 'W'
-        43: 0,  # 'Y'
-        56: 0,  # 'Z'
-        1: 1,  # 'a'
-        21: 0,  # 'b'
-        28: 0,  # 'c'
-        12: 0,  # 'd'
-        2: 2,  # 'e'
-        18: 0,  # 'f'
-        27: 0,  # 'g'
-        25: 1,  # 'h'
-        3: 0,  # 'i'
-        24: 0,  # 'j'
-        10: 1,  # 'k'
-        5: 0,  # 'l'
-        13: 0,  # 'm'
-        4: 1,  # 'n'
-        15: 0,  # 'o'
-        26: 0,  # 'p'
-        7: 0,  # 'r'
-        8: 1,  # 's'
-        9: 0,  # 't'
-        14: 1,  # 'u'
-        32: 0,  # 'v'
-        57: 2,  # 'w'
-        58: 0,  # 'x'
-        11: 0,  # 'y'
-        22: 0,  # 'z'
-        63: 1,  # '·'
-        54: 0,  # 'Ç'
-        50: 0,  # 'Ö'
-        55: 0,  # 'Ü'
-        59: 0,  # 'â'
-        33: 0,  # 'ç'
-        61: 0,  # 'î'
-        34: 0,  # 'ö'
-        17: 1,  # 'ü'
-        30: 0,  # 'ÄŸ'
-        41: 0,  # 'İ'
-        6: 0,  # 'ı'
-        40: 0,  # 'Åž'
-        19: 0,  # 'ÅŸ'
-    },
-    58: {  # 'x'
-        23: 0,  # 'A'
-        37: 0,  # 'B'
-        47: 0,  # 'C'
-        39: 0,  # 'D'
-        29: 1,  # 'E'
-        52: 0,  # 'F'
-        36: 0,  # 'G'
-        45: 0,  # 'H'
-        53: 0,  # 'I'
-        60: 1,  # 'J'
-        16: 0,  # 'K'
-        49: 0,  # 'L'
-        20: 1,  # 'M'
-        46: 0,  # 'N'
-        42: 0,  # 'O'
-        48: 0,  # 'P'
-        44: 0,  # 'R'
-        35: 0,  # 'S'
-        31: 0,  # 'T'
-        51: 0,  # 'U'
-        38: 0,  # 'V'
-        62: 0,  # 'W'
-        43: 0,  # 'Y'
-        56: 0,  # 'Z'
-        1: 0,  # 'a'
-        21: 1,  # 'b'
-        28: 0,  # 'c'
-        12: 2,  # 'd'
-        2: 1,  # 'e'
-        18: 0,  # 'f'
-        27: 0,  # 'g'
-        25: 0,  # 'h'
-        3: 2,  # 'i'
-        24: 2,  # 'j'
-        10: 1,  # 'k'
-        5: 0,  # 'l'
-        13: 0,  # 'm'
-        4: 2,  # 'n'
-        15: 0,  # 'o'
-        26: 0,  # 'p'
-        7: 1,  # 'r'
-        8: 2,  # 's'
-        9: 1,  # 't'
-        14: 0,  # 'u'
-        32: 0,  # 'v'
-        57: 0,  # 'w'
-        58: 0,  # 'x'
-        11: 2,  # 'y'
-        22: 0,  # 'z'
-        63: 0,  # '·'
-        54: 0,  # 'Ç'
-        50: 0,  # 'Ö'
-        55: 0,  # 'Ü'
-        59: 0,  # 'â'
-        33: 0,  # 'ç'
-        61: 0,  # 'î'
-        34: 0,  # 'ö'
-        17: 1,  # 'ü'
-        30: 0,  # 'ÄŸ'
-        41: 0,  # 'İ'
-        6: 2,  # 'ı'
-        40: 0,  # 'Åž'
-        19: 0,  # 'ÅŸ'
-    },
-    11: {  # 'y'
-        23: 1,  # 'A'
-        37: 0,  # 'B'
-        47: 0,  # 'C'
-        39: 0,  # 'D'
-        29: 0,  # 'E'
-        52: 0,  # 'F'
-        36: 0,  # 'G'
-        45: 0,  # 'H'
-        53: 0,  # 'I'
-        60: 1,  # 'J'
-        16: 3,  # 'K'
-        49: 0,  # 'L'
-        20: 1,  # 'M'
-        46: 0,  # 'N'
-        42: 0,  # 'O'
-        48: 0,  # 'P'
-        44: 0,  # 'R'
-        35: 0,  # 'S'
-        31: 1,  # 'T'
-        51: 0,  # 'U'
-        38: 0,  # 'V'
-        62: 0,  # 'W'
-        43: 1,  # 'Y'
-        56: 1,  # 'Z'
-        1: 3,  # 'a'
-        21: 1,  # 'b'
-        28: 0,  # 'c'
-        12: 2,  # 'd'
-        2: 3,  # 'e'
-        18: 0,  # 'f'
-        27: 2,  # 'g'
-        25: 2,  # 'h'
-        3: 2,  # 'i'
-        24: 1,  # 'j'
-        10: 2,  # 'k'
-        5: 3,  # 'l'
-        13: 3,  # 'm'
-        4: 3,  # 'n'
-        15: 0,  # 'o'
-        26: 1,  # 'p'
-        7: 2,  # 'r'
-        8: 1,  # 's'
-        9: 2,  # 't'
-        14: 3,  # 'u'
-        32: 0,  # 'v'
-        57: 0,  # 'w'
-        58: 1,  # 'x'
-        11: 3,  # 'y'
-        22: 0,  # 'z'
-        63: 0,  # '·'
-        54: 0,  # 'Ç'
-        50: 0,  # 'Ö'
-        55: 0,  # 'Ü'
-        59: 0,  # 'â'
-        33: 3,  # 'ç'
-        61: 0,  # 'î'
-        34: 0,  # 'ö'
-        17: 2,  # 'ü'
-        30: 0,  # 'ÄŸ'
-        41: 0,  # 'İ'
-        6: 3,  # 'ı'
-        40: 0,  # 'Åž'
-        19: 0,  # 'ÅŸ'
-    },
-    22: {  # 'z'
-        23: 2,  # 'A'
-        37: 2,  # 'B'
-        47: 1,  # 'C'
-        39: 2,  # 'D'
-        29: 3,  # 'E'
-        52: 1,  # 'F'
-        36: 2,  # 'G'
-        45: 2,  # 'H'
-        53: 1,  # 'I'
-        60: 0,  # 'J'
-        16: 0,  # 'K'
-        49: 0,  # 'L'
-        20: 3,  # 'M'
-        46: 2,  # 'N'
-        42: 2,  # 'O'
-        48: 2,  # 'P'
-        44: 1,  # 'R'
-        35: 1,  # 'S'
-        31: 3,  # 'T'
-        51: 2,  # 'U'
-        38: 2,  # 'V'
-        62: 0,  # 'W'
-        43: 2,  # 'Y'
-        56: 1,  # 'Z'
-        1: 1,  # 'a'
-        21: 2,  # 'b'
-        28: 1,  # 'c'
-        12: 2,  # 'd'
-        2: 2,  # 'e'
-        18: 3,  # 'f'
-        27: 2,  # 'g'
-        25: 2,  # 'h'
-        3: 3,  # 'i'
-        24: 2,  # 'j'
-        10: 3,  # 'k'
-        5: 0,  # 'l'
-        13: 2,  # 'm'
-        4: 3,  # 'n'
-        15: 2,  # 'o'
-        26: 2,  # 'p'
-        7: 3,  # 'r'
-        8: 3,  # 's'
-        9: 3,  # 't'
-        14: 0,  # 'u'
-        32: 2,  # 'v'
-        57: 0,  # 'w'
-        58: 0,  # 'x'
-        11: 3,  # 'y'
-        22: 2,  # 'z'
-        63: 1,  # '·'
-        54: 0,  # 'Ç'
-        50: 0,  # 'Ö'
-        55: 2,  # 'Ü'
-        59: 1,  # 'â'
-        33: 0,  # 'ç'
-        61: 0,  # 'î'
-        34: 2,  # 'ö'
-        17: 2,  # 'ü'
-        30: 2,  # 'ÄŸ'
-        41: 1,  # 'İ'
-        6: 3,  # 'ı'
-        40: 1,  # 'Åž'
-        19: 2,  # 'ÅŸ'
-    },
-    63: {  # '·'
-        23: 0,  # 'A'
-        37: 0,  # 'B'
-        47: 0,  # 'C'
-        39: 0,  # 'D'
-        29: 0,  # 'E'
-        52: 0,  # 'F'
-        36: 0,  # 'G'
-        45: 0,  # 'H'
-        53: 0,  # 'I'
-        60: 0,  # 'J'
-        16: 0,  # 'K'
-        49: 0,  # 'L'
-        20: 0,  # 'M'
-        46: 0,  # 'N'
-        42: 0,  # 'O'
-        48: 0,  # 'P'
-        44: 0,  # 'R'
-        35: 0,  # 'S'
-        31: 0,  # 'T'
-        51: 0,  # 'U'
-        38: 0,  # 'V'
-        62: 0,  # 'W'
-        43: 0,  # 'Y'
-        56: 0,  # 'Z'
-        1: 0,  # 'a'
-        21: 0,  # 'b'
-        28: 0,  # 'c'
-        12: 0,  # 'd'
-        2: 1,  # 'e'
-        18: 0,  # 'f'
-        27: 0,  # 'g'
-        25: 0,  # 'h'
-        3: 0,  # 'i'
-        24: 0,  # 'j'
-        10: 0,  # 'k'
-        5: 0,  # 'l'
-        13: 2,  # 'm'
-        4: 0,  # 'n'
-        15: 0,  # 'o'
-        26: 0,  # 'p'
-        7: 0,  # 'r'
-        8: 0,  # 's'
-        9: 0,  # 't'
-        14: 2,  # 'u'
-        32: 0,  # 'v'
-        57: 0,  # 'w'
-        58: 0,  # 'x'
-        11: 0,  # 'y'
-        22: 0,  # 'z'
-        63: 0,  # '·'
-        54: 0,  # 'Ç'
-        50: 0,  # 'Ö'
-        55: 0,  # 'Ü'
-        59: 0,  # 'â'
-        33: 0,  # 'ç'
-        61: 0,  # 'î'
-        34: 0,  # 'ö'
-        17: 0,  # 'ü'
-        30: 0,  # 'ÄŸ'
-        41: 0,  # 'İ'
-        6: 0,  # 'ı'
-        40: 0,  # 'Åž'
-        19: 0,  # 'ÅŸ'
-    },
-    54: {  # 'Ç'
-        23: 0,  # 'A'
-        37: 0,  # 'B'
-        47: 1,  # 'C'
-        39: 1,  # 'D'
-        29: 0,  # 'E'
-        52: 0,  # 'F'
-        36: 1,  # 'G'
-        45: 1,  # 'H'
-        53: 1,  # 'I'
-        60: 0,  # 'J'
-        16: 0,  # 'K'
-        49: 0,  # 'L'
-        20: 0,  # 'M'
-        46: 0,  # 'N'
-        42: 1,  # 'O'
-        48: 1,  # 'P'
-        44: 0,  # 'R'
-        35: 0,  # 'S'
-        31: 0,  # 'T'
-        51: 1,  # 'U'
-        38: 1,  # 'V'
-        62: 0,  # 'W'
-        43: 2,  # 'Y'
-        56: 0,  # 'Z'
-        1: 0,  # 'a'
-        21: 1,  # 'b'
-        28: 0,  # 'c'
-        12: 1,  # 'd'
-        2: 0,  # 'e'
-        18: 0,  # 'f'
-        27: 1,  # 'g'
-        25: 0,  # 'h'
-        3: 3,  # 'i'
-        24: 0,  # 'j'
-        10: 1,  # 'k'
-        5: 0,  # 'l'
-        13: 0,  # 'm'
-        4: 2,  # 'n'
-        15: 1,  # 'o'
-        26: 0,  # 'p'
-        7: 2,  # 'r'
-        8: 0,  # 's'
-        9: 1,  # 't'
-        14: 0,  # 'u'
-        32: 2,  # 'v'
-        57: 0,  # 'w'
-        58: 0,  # 'x'
-        11: 0,  # 'y'
-        22: 0,  # 'z'
-        63: 0,  # '·'
-        54: 0,  # 'Ç'
-        50: 0,  # 'Ö'
-        55: 2,  # 'Ü'
-        59: 0,  # 'â'
-        33: 0,  # 'ç'
-        61: 0,  # 'î'
-        34: 1,  # 'ö'
-        17: 0,  # 'ü'
-        30: 0,  # 'ÄŸ'
-        41: 0,  # 'İ'
-        6: 2,  # 'ı'
-        40: 0,  # 'Åž'
-        19: 1,  # 'ÅŸ'
-    },
-    50: {  # 'Ö'
-        23: 0,  # 'A'
-        37: 0,  # 'B'
-        47: 1,  # 'C'
-        39: 1,  # 'D'
-        29: 2,  # 'E'
-        52: 0,  # 'F'
-        36: 1,  # 'G'
-        45: 2,  # 'H'
-        53: 0,  # 'I'
-        60: 0,  # 'J'
-        16: 0,  # 'K'
-        49: 0,  # 'L'
-        20: 1,  # 'M'
-        46: 1,  # 'N'
-        42: 2,  # 'O'
-        48: 2,  # 'P'
-        44: 1,  # 'R'
-        35: 0,  # 'S'
-        31: 0,  # 'T'
-        51: 1,  # 'U'
-        38: 1,  # 'V'
-        62: 0,  # 'W'
-        43: 2,  # 'Y'
-        56: 0,  # 'Z'
-        1: 0,  # 'a'
-        21: 2,  # 'b'
-        28: 1,  # 'c'
-        12: 2,  # 'd'
-        2: 0,  # 'e'
-        18: 1,  # 'f'
-        27: 1,  # 'g'
-        25: 1,  # 'h'
-        3: 2,  # 'i'
-        24: 0,  # 'j'
-        10: 2,  # 'k'
-        5: 0,  # 'l'
-        13: 0,  # 'm'
-        4: 3,  # 'n'
-        15: 2,  # 'o'
-        26: 2,  # 'p'
-        7: 3,  # 'r'
-        8: 1,  # 's'
-        9: 2,  # 't'
-        14: 0,  # 'u'
-        32: 1,  # 'v'
-        57: 0,  # 'w'
-        58: 0,  # 'x'
-        11: 0,  # 'y'
-        22: 1,  # 'z'
-        63: 0,  # '·'
-        54: 0,  # 'Ç'
-        50: 0,  # 'Ö'
-        55: 0,  # 'Ü'
-        59: 0,  # 'â'
-        33: 0,  # 'ç'
-        61: 0,  # 'î'
-        34: 2,  # 'ö'
-        17: 2,  # 'ü'
-        30: 1,  # 'ÄŸ'
-        41: 0,  # 'İ'
-        6: 2,  # 'ı'
-        40: 0,  # 'Åž'
-        19: 1,  # 'ÅŸ'
-    },
-    55: {  # 'Ü'
-        23: 0,  # 'A'
-        37: 0,  # 'B'
-        47: 0,  # 'C'
-        39: 0,  # 'D'
-        29: 0,  # 'E'
-        52: 2,  # 'F'
-        36: 0,  # 'G'
-        45: 0,  # 'H'
-        53: 0,  # 'I'
-        60: 0,  # 'J'
-        16: 1,  # 'K'
-        49: 0,  # 'L'
-        20: 0,  # 'M'
-        46: 0,  # 'N'
-        42: 0,  # 'O'
-        48: 1,  # 'P'
-        44: 0,  # 'R'
-        35: 0,  # 'S'
-        31: 0,  # 'T'
-        51: 0,  # 'U'
-        38: 1,  # 'V'
-        62: 0,  # 'W'
-        43: 0,  # 'Y'
-        56: 0,  # 'Z'
-        1: 2,  # 'a'
-        21: 0,  # 'b'
-        28: 2,  # 'c'
-        12: 0,  # 'd'
-        2: 2,  # 'e'
-        18: 0,  # 'f'
-        27: 1,  # 'g'
-        25: 0,  # 'h'
-        3: 0,  # 'i'
-        24: 0,  # 'j'
-        10: 0,  # 'k'
-        5: 1,  # 'l'
-        13: 1,  # 'm'
-        4: 1,  # 'n'
-        15: 0,  # 'o'
-        26: 0,  # 'p'
-        7: 0,  # 'r'
-        8: 0,  # 's'
-        9: 1,  # 't'
-        14: 2,  # 'u'
-        32: 0,  # 'v'
-        57: 0,  # 'w'
-        58: 0,  # 'x'
-        11: 0,  # 'y'
-        22: 1,  # 'z'
-        63: 0,  # '·'
-        54: 0,  # 'Ç'
-        50: 1,  # 'Ö'
-        55: 0,  # 'Ü'
-        59: 0,  # 'â'
-        33: 0,  # 'ç'
-        61: 0,  # 'î'
-        34: 1,  # 'ö'
-        17: 0,  # 'ü'
-        30: 1,  # 'ÄŸ'
-        41: 1,  # 'İ'
-        6: 0,  # 'ı'
-        40: 0,  # 'Åž'
-        19: 1,  # 'ÅŸ'
-    },
-    59: {  # 'â'
-        23: 0,  # 'A'
-        37: 0,  # 'B'
-        47: 0,  # 'C'
-        39: 0,  # 'D'
-        29: 0,  # 'E'
-        52: 0,  # 'F'
-        36: 1,  # 'G'
-        45: 0,  # 'H'
-        53: 0,  # 'I'
-        60: 0,  # 'J'
-        16: 1,  # 'K'
-        49: 0,  # 'L'
-        20: 0,  # 'M'
-        46: 0,  # 'N'
-        42: 0,  # 'O'
-        48: 0,  # 'P'
-        44: 0,  # 'R'
-        35: 0,  # 'S'
-        31: 0,  # 'T'
-        51: 0,  # 'U'
-        38: 0,  # 'V'
-        62: 0,  # 'W'
-        43: 0,  # 'Y'
-        56: 0,  # 'Z'
-        1: 2,  # 'a'
-        21: 0,  # 'b'
-        28: 0,  # 'c'
-        12: 0,  # 'd'
-        2: 2,  # 'e'
-        18: 0,  # 'f'
-        27: 0,  # 'g'
-        25: 0,  # 'h'
-        3: 0,  # 'i'
-        24: 0,  # 'j'
-        10: 0,  # 'k'
-        5: 0,  # 'l'
-        13: 2,  # 'm'
-        4: 0,  # 'n'
-        15: 1,  # 'o'
-        26: 0,  # 'p'
-        7: 0,  # 'r'
-        8: 0,  # 's'
-        9: 0,  # 't'
-        14: 2,  # 'u'
-        32: 0,  # 'v'
-        57: 0,  # 'w'
-        58: 0,  # 'x'
-        11: 0,  # 'y'
-        22: 1,  # 'z'
-        63: 0,  # '·'
-        54: 0,  # 'Ç'
-        50: 0,  # 'Ö'
-        55: 0,  # 'Ü'
-        59: 0,  # 'â'
-        33: 0,  # 'ç'
-        61: 0,  # 'î'
-        34: 0,  # 'ö'
-        17: 0,  # 'ü'
-        30: 0,  # 'ÄŸ'
-        41: 0,  # 'İ'
-        6: 1,  # 'ı'
-        40: 1,  # 'Åž'
-        19: 0,  # 'ÅŸ'
-    },
-    33: {  # 'ç'
-        23: 0,  # 'A'
-        37: 0,  # 'B'
-        47: 0,  # 'C'
-        39: 0,  # 'D'
-        29: 3,  # 'E'
-        52: 0,  # 'F'
-        36: 0,  # 'G'
-        45: 0,  # 'H'
-        53: 0,  # 'I'
-        60: 0,  # 'J'
-        16: 0,  # 'K'
-        49: 0,  # 'L'
-        20: 1,  # 'M'
-        46: 0,  # 'N'
-        42: 0,  # 'O'
-        48: 0,  # 'P'
-        44: 0,  # 'R'
-        35: 0,  # 'S'
-        31: 2,  # 'T'
-        51: 0,  # 'U'
-        38: 1,  # 'V'
-        62: 0,  # 'W'
-        43: 0,  # 'Y'
-        56: 0,  # 'Z'
-        1: 0,  # 'a'
-        21: 3,  # 'b'
-        28: 0,  # 'c'
-        12: 2,  # 'd'
-        2: 0,  # 'e'
-        18: 2,  # 'f'
-        27: 1,  # 'g'
-        25: 3,  # 'h'
-        3: 3,  # 'i'
-        24: 0,  # 'j'
-        10: 3,  # 'k'
-        5: 0,  # 'l'
-        13: 0,  # 'm'
-        4: 3,  # 'n'
-        15: 0,  # 'o'
-        26: 1,  # 'p'
-        7: 3,  # 'r'
-        8: 2,  # 's'
-        9: 3,  # 't'
-        14: 0,  # 'u'
-        32: 2,  # 'v'
-        57: 0,  # 'w'
-        58: 0,  # 'x'
-        11: 2,  # 'y'
-        22: 0,  # 'z'
-        63: 0,  # '·'
-        54: 0,  # 'Ç'
-        50: 0,  # 'Ö'
-        55: 0,  # 'Ü'
-        59: 0,  # 'â'
-        33: 0,  # 'ç'
-        61: 0,  # 'î'
-        34: 0,  # 'ö'
-        17: 1,  # 'ü'
-        30: 0,  # 'ÄŸ'
-        41: 0,  # 'İ'
-        6: 3,  # 'ı'
-        40: 0,  # 'Åž'
-        19: 0,  # 'ÅŸ'
-    },
-    61: {  # 'î'
-        23: 0,  # 'A'
-        37: 0,  # 'B'
-        47: 0,  # 'C'
-        39: 0,  # 'D'
-        29: 0,  # 'E'
-        52: 0,  # 'F'
-        36: 0,  # 'G'
-        45: 0,  # 'H'
-        53: 0,  # 'I'
-        60: 0,  # 'J'
-        16: 0,  # 'K'
-        49: 0,  # 'L'
-        20: 0,  # 'M'
-        46: 0,  # 'N'
-        42: 0,  # 'O'
-        48: 0,  # 'P'
-        44: 0,  # 'R'
-        35: 0,  # 'S'
-        31: 0,  # 'T'
-        51: 0,  # 'U'
-        38: 0,  # 'V'
-        62: 0,  # 'W'
-        43: 0,  # 'Y'
-        56: 1,  # 'Z'
-        1: 2,  # 'a'
-        21: 0,  # 'b'
-        28: 0,  # 'c'
-        12: 0,  # 'd'
-        2: 2,  # 'e'
-        18: 0,  # 'f'
-        27: 0,  # 'g'
-        25: 0,  # 'h'
-        3: 0,  # 'i'
-        24: 1,  # 'j'
-        10: 0,  # 'k'
-        5: 0,  # 'l'
-        13: 1,  # 'm'
-        4: 1,  # 'n'
-        15: 0,  # 'o'
-        26: 0,  # 'p'
-        7: 0,  # 'r'
-        8: 0,  # 's'
-        9: 0,  # 't'
-        14: 1,  # 'u'
-        32: 0,  # 'v'
-        57: 0,  # 'w'
-        58: 0,  # 'x'
-        11: 0,  # 'y'
-        22: 1,  # 'z'
-        63: 0,  # '·'
-        54: 0,  # 'Ç'
-        50: 0,  # 'Ö'
-        55: 0,  # 'Ü'
-        59: 0,  # 'â'
-        33: 0,  # 'ç'
-        61: 1,  # 'î'
-        34: 0,  # 'ö'
-        17: 0,  # 'ü'
-        30: 0,  # 'ÄŸ'
-        41: 0,  # 'İ'
-        6: 1,  # 'ı'
-        40: 0,  # 'Åž'
-        19: 0,  # 'ÅŸ'
-    },
-    34: {  # 'ö'
-        23: 0,  # 'A'
-        37: 1,  # 'B'
-        47: 1,  # 'C'
-        39: 0,  # 'D'
-        29: 0,  # 'E'
-        52: 2,  # 'F'
-        36: 1,  # 'G'
-        45: 1,  # 'H'
-        53: 0,  # 'I'
-        60: 0,  # 'J'
-        16: 3,  # 'K'
-        49: 1,  # 'L'
-        20: 0,  # 'M'
-        46: 1,  # 'N'
-        42: 1,  # 'O'
-        48: 2,  # 'P'
-        44: 1,  # 'R'
-        35: 1,  # 'S'
-        31: 1,  # 'T'
-        51: 1,  # 'U'
-        38: 1,  # 'V'
-        62: 0,  # 'W'
-        43: 0,  # 'Y'
-        56: 1,  # 'Z'
-        1: 3,  # 'a'
-        21: 1,  # 'b'
-        28: 2,  # 'c'
-        12: 1,  # 'd'
-        2: 3,  # 'e'
-        18: 0,  # 'f'
-        27: 2,  # 'g'
-        25: 2,  # 'h'
-        3: 1,  # 'i'
-        24: 2,  # 'j'
-        10: 1,  # 'k'
-        5: 2,  # 'l'
-        13: 3,  # 'm'
-        4: 2,  # 'n'
-        15: 2,  # 'o'
-        26: 0,  # 'p'
-        7: 0,  # 'r'
-        8: 3,  # 's'
-        9: 1,  # 't'
-        14: 3,  # 'u'
-        32: 0,  # 'v'
-        57: 0,  # 'w'
-        58: 0,  # 'x'
-        11: 1,  # 'y'
-        22: 2,  # 'z'
-        63: 0,  # '·'
-        54: 1,  # 'Ç'
-        50: 2,  # 'Ö'
-        55: 0,  # 'Ü'
-        59: 0,  # 'â'
-        33: 2,  # 'ç'
-        61: 0,  # 'î'
-        34: 2,  # 'ö'
-        17: 0,  # 'ü'
-        30: 2,  # 'ÄŸ'
-        41: 1,  # 'İ'
-        6: 1,  # 'ı'
-        40: 2,  # 'Åž'
-        19: 1,  # 'ÅŸ'
-    },
-    17: {  # 'ü'
-        23: 0,  # 'A'
-        37: 0,  # 'B'
-        47: 1,  # 'C'
-        39: 0,  # 'D'
-        29: 0,  # 'E'
-        52: 0,  # 'F'
-        36: 0,  # 'G'
-        45: 0,  # 'H'
-        53: 0,  # 'I'
-        60: 1,  # 'J'
-        16: 1,  # 'K'
-        49: 0,  # 'L'
-        20: 1,  # 'M'
-        46: 0,  # 'N'
-        42: 0,  # 'O'
-        48: 0,  # 'P'
-        44: 0,  # 'R'
-        35: 0,  # 'S'
-        31: 1,  # 'T'
-        51: 0,  # 'U'
-        38: 0,  # 'V'
-        62: 0,  # 'W'
-        43: 0,  # 'Y'
-        56: 1,  # 'Z'
-        1: 3,  # 'a'
-        21: 0,  # 'b'
-        28: 0,  # 'c'
-        12: 1,  # 'd'
-        2: 3,  # 'e'
-        18: 1,  # 'f'
-        27: 2,  # 'g'
-        25: 0,  # 'h'
-        3: 1,  # 'i'
-        24: 1,  # 'j'
-        10: 2,  # 'k'
-        5: 3,  # 'l'
-        13: 2,  # 'm'
-        4: 3,  # 'n'
-        15: 0,  # 'o'
-        26: 2,  # 'p'
-        7: 2,  # 'r'
-        8: 3,  # 's'
-        9: 2,  # 't'
-        14: 3,  # 'u'
-        32: 1,  # 'v'
-        57: 1,  # 'w'
-        58: 0,  # 'x'
-        11: 0,  # 'y'
-        22: 0,  # 'z'
-        63: 0,  # '·'
-        54: 0,  # 'Ç'
-        50: 0,  # 'Ö'
-        55: 0,  # 'Ü'
-        59: 0,  # 'â'
-        33: 1,  # 'ç'
-        61: 0,  # 'î'
-        34: 0,  # 'ö'
-        17: 2,  # 'ü'
-        30: 0,  # 'ÄŸ'
-        41: 0,  # 'İ'
-        6: 2,  # 'ı'
-        40: 0,  # 'Åž'
-        19: 0,  # 'ÅŸ'
-    },
-    30: {  # 'ÄŸ'
-        23: 0,  # 'A'
-        37: 2,  # 'B'
-        47: 1,  # 'C'
-        39: 0,  # 'D'
-        29: 0,  # 'E'
-        52: 2,  # 'F'
-        36: 1,  # 'G'
-        45: 0,  # 'H'
-        53: 1,  # 'I'
-        60: 0,  # 'J'
-        16: 3,  # 'K'
-        49: 0,  # 'L'
-        20: 1,  # 'M'
-        46: 2,  # 'N'
-        42: 2,  # 'O'
-        48: 1,  # 'P'
-        44: 1,  # 'R'
-        35: 0,  # 'S'
-        31: 1,  # 'T'
-        51: 0,  # 'U'
-        38: 2,  # 'V'
-        62: 0,  # 'W'
-        43: 2,  # 'Y'
-        56: 0,  # 'Z'
-        1: 3,  # 'a'
-        21: 0,  # 'b'
-        28: 2,  # 'c'
-        12: 0,  # 'd'
-        2: 2,  # 'e'
-        18: 0,  # 'f'
-        27: 0,  # 'g'
-        25: 0,  # 'h'
-        3: 0,  # 'i'
-        24: 3,  # 'j'
-        10: 1,  # 'k'
-        5: 2,  # 'l'
-        13: 3,  # 'm'
-        4: 0,  # 'n'
-        15: 1,  # 'o'
-        26: 0,  # 'p'
-        7: 1,  # 'r'
-        8: 0,  # 's'
-        9: 0,  # 't'
-        14: 3,  # 'u'
-        32: 0,  # 'v'
-        57: 0,  # 'w'
-        58: 0,  # 'x'
-        11: 0,  # 'y'
-        22: 2,  # 'z'
-        63: 0,  # '·'
-        54: 2,  # 'Ç'
-        50: 2,  # 'Ö'
-        55: 0,  # 'Ü'
-        59: 0,  # 'â'
-        33: 1,  # 'ç'
-        61: 0,  # 'î'
-        34: 2,  # 'ö'
-        17: 0,  # 'ü'
-        30: 1,  # 'ÄŸ'
-        41: 2,  # 'İ'
-        6: 2,  # 'ı'
-        40: 2,  # 'Åž'
-        19: 1,  # 'ÅŸ'
-    },
-    41: {  # 'İ'
-        23: 0,  # 'A'
-        37: 0,  # 'B'
-        47: 1,  # 'C'
-        39: 1,  # 'D'
-        29: 1,  # 'E'
-        52: 0,  # 'F'
-        36: 2,  # 'G'
-        45: 2,  # 'H'
-        53: 0,  # 'I'
-        60: 0,  # 'J'
-        16: 0,  # 'K'
-        49: 0,  # 'L'
-        20: 2,  # 'M'
-        46: 1,  # 'N'
-        42: 1,  # 'O'
-        48: 2,  # 'P'
-        44: 0,  # 'R'
-        35: 1,  # 'S'
-        31: 1,  # 'T'
-        51: 1,  # 'U'
-        38: 1,  # 'V'
-        62: 0,  # 'W'
-        43: 2,  # 'Y'
-        56: 0,  # 'Z'
-        1: 1,  # 'a'
-        21: 2,  # 'b'
-        28: 1,  # 'c'
-        12: 2,  # 'd'
-        2: 1,  # 'e'
-        18: 0,  # 'f'
-        27: 3,  # 'g'
-        25: 2,  # 'h'
-        3: 2,  # 'i'
-        24: 2,  # 'j'
-        10: 2,  # 'k'
-        5: 0,  # 'l'
-        13: 1,  # 'm'
-        4: 3,  # 'n'
-        15: 1,  # 'o'
-        26: 1,  # 'p'
-        7: 3,  # 'r'
-        8: 3,  # 's'
-        9: 2,  # 't'
-        14: 0,  # 'u'
-        32: 0,  # 'v'
-        57: 1,  # 'w'
-        58: 0,  # 'x'
-        11: 2,  # 'y'
-        22: 0,  # 'z'
-        63: 0,  # '·'
-        54: 0,  # 'Ç'
-        50: 0,  # 'Ö'
-        55: 1,  # 'Ü'
-        59: 1,  # 'â'
-        33: 0,  # 'ç'
-        61: 0,  # 'î'
-        34: 1,  # 'ö'
-        17: 1,  # 'ü'
-        30: 2,  # 'ÄŸ'
-        41: 0,  # 'İ'
-        6: 3,  # 'ı'
-        40: 0,  # 'Åž'
-        19: 1,  # 'ÅŸ'
-    },
-    6: {  # 'ı'
-        23: 2,  # 'A'
-        37: 0,  # 'B'
-        47: 0,  # 'C'
-        39: 0,  # 'D'
-        29: 0,  # 'E'
-        52: 0,  # 'F'
-        36: 1,  # 'G'
-        45: 0,  # 'H'
-        53: 0,  # 'I'
-        60: 2,  # 'J'
-        16: 3,  # 'K'
-        49: 0,  # 'L'
-        20: 3,  # 'M'
-        46: 1,  # 'N'
-        42: 0,  # 'O'
-        48: 0,  # 'P'
-        44: 0,  # 'R'
-        35: 0,  # 'S'
-        31: 2,  # 'T'
-        51: 0,  # 'U'
-        38: 0,  # 'V'
-        62: 0,  # 'W'
-        43: 2,  # 'Y'
-        56: 1,  # 'Z'
-        1: 3,  # 'a'
-        21: 2,  # 'b'
-        28: 1,  # 'c'
-        12: 3,  # 'd'
-        2: 3,  # 'e'
-        18: 3,  # 'f'
-        27: 3,  # 'g'
-        25: 2,  # 'h'
-        3: 3,  # 'i'
-        24: 3,  # 'j'
-        10: 3,  # 'k'
-        5: 3,  # 'l'
-        13: 3,  # 'm'
-        4: 3,  # 'n'
-        15: 0,  # 'o'
-        26: 3,  # 'p'
-        7: 3,  # 'r'
-        8: 3,  # 's'
-        9: 3,  # 't'
-        14: 3,  # 'u'
-        32: 3,  # 'v'
-        57: 1,  # 'w'
-        58: 1,  # 'x'
-        11: 3,  # 'y'
-        22: 0,  # 'z'
-        63: 1,  # '·'
-        54: 0,  # 'Ç'
-        50: 0,  # 'Ö'
-        55: 0,  # 'Ü'
-        59: 0,  # 'â'
-        33: 2,  # 'ç'
-        61: 0,  # 'î'
-        34: 0,  # 'ö'
-        17: 3,  # 'ü'
-        30: 0,  # 'ÄŸ'
-        41: 0,  # 'İ'
-        6: 3,  # 'ı'
-        40: 0,  # 'Åž'
-        19: 0,  # 'ÅŸ'
-    },
-    40: {  # 'Åž'
-        23: 0,  # 'A'
-        37: 0,  # 'B'
-        47: 1,  # 'C'
-        39: 1,  # 'D'
-        29: 1,  # 'E'
-        52: 0,  # 'F'
-        36: 1,  # 'G'
-        45: 2,  # 'H'
-        53: 1,  # 'I'
-        60: 0,  # 'J'
-        16: 0,  # 'K'
-        49: 0,  # 'L'
-        20: 2,  # 'M'
-        46: 1,  # 'N'
-        42: 1,  # 'O'
-        48: 2,  # 'P'
-        44: 2,  # 'R'
-        35: 1,  # 'S'
-        31: 1,  # 'T'
-        51: 0,  # 'U'
-        38: 1,  # 'V'
-        62: 0,  # 'W'
-        43: 2,  # 'Y'
-        56: 1,  # 'Z'
-        1: 0,  # 'a'
-        21: 2,  # 'b'
-        28: 0,  # 'c'
-        12: 2,  # 'd'
-        2: 0,  # 'e'
-        18: 3,  # 'f'
-        27: 0,  # 'g'
-        25: 2,  # 'h'
-        3: 3,  # 'i'
-        24: 2,  # 'j'
-        10: 1,  # 'k'
-        5: 0,  # 'l'
-        13: 1,  # 'm'
-        4: 3,  # 'n'
-        15: 2,  # 'o'
-        26: 0,  # 'p'
-        7: 3,  # 'r'
-        8: 2,  # 's'
-        9: 2,  # 't'
-        14: 1,  # 'u'
-        32: 3,  # 'v'
-        57: 0,  # 'w'
-        58: 0,  # 'x'
-        11: 2,  # 'y'
-        22: 0,  # 'z'
-        63: 0,  # '·'
-        54: 0,  # 'Ç'
-        50: 0,  # 'Ö'
-        55: 1,  # 'Ü'
-        59: 0,  # 'â'
-        33: 0,  # 'ç'
-        61: 0,  # 'î'
-        34: 2,  # 'ö'
-        17: 1,  # 'ü'
-        30: 2,  # 'ÄŸ'
-        41: 0,  # 'İ'
-        6: 2,  # 'ı'
-        40: 1,  # 'Åž'
-        19: 2,  # 'ÅŸ'
-    },
-    19: {  # 'ÅŸ'
-        23: 0,  # 'A'
-        37: 0,  # 'B'
-        47: 1,  # 'C'
-        39: 0,  # 'D'
-        29: 0,  # 'E'
-        52: 2,  # 'F'
-        36: 1,  # 'G'
-        45: 0,  # 'H'
-        53: 0,  # 'I'
-        60: 0,  # 'J'
-        16: 3,  # 'K'
-        49: 2,  # 'L'
-        20: 0,  # 'M'
-        46: 1,  # 'N'
-        42: 1,  # 'O'
-        48: 1,  # 'P'
-        44: 1,  # 'R'
-        35: 1,  # 'S'
-        31: 0,  # 'T'
-        51: 1,  # 'U'
-        38: 1,  # 'V'
-        62: 0,  # 'W'
-        43: 1,  # 'Y'
-        56: 0,  # 'Z'
-        1: 3,  # 'a'
-        21: 1,  # 'b'
-        28: 2,  # 'c'
-        12: 0,  # 'd'
-        2: 3,  # 'e'
-        18: 0,  # 'f'
-        27: 2,  # 'g'
-        25: 1,  # 'h'
-        3: 1,  # 'i'
-        24: 0,  # 'j'
-        10: 2,  # 'k'
-        5: 2,  # 'l'
-        13: 3,  # 'm'
-        4: 0,  # 'n'
-        15: 0,  # 'o'
-        26: 1,  # 'p'
-        7: 3,  # 'r'
-        8: 0,  # 's'
-        9: 0,  # 't'
-        14: 3,  # 'u'
-        32: 0,  # 'v'
-        57: 0,  # 'w'
-        58: 0,  # 'x'
-        11: 0,  # 'y'
-        22: 2,  # 'z'
-        63: 0,  # '·'
-        54: 1,  # 'Ç'
-        50: 2,  # 'Ö'
-        55: 0,  # 'Ü'
-        59: 0,  # 'â'
-        33: 1,  # 'ç'
-        61: 1,  # 'î'
-        34: 2,  # 'ö'
-        17: 0,  # 'ü'
-        30: 1,  # 'ÄŸ'
-        41: 1,  # 'İ'
-        6: 1,  # 'ı'
-        40: 1,  # 'Åž'
-        19: 1,  # 'ÅŸ'
-    },
-}
-
-# 255: Undefined characters that did not exist in training text
-# 254: Carriage/Return
-# 253: symbol (punctuation) that does not belong to word
-# 252: 0 - 9
-# 251: Control characters
-
-# Character Mapping Table(s):
-ISO_8859_9_TURKISH_CHAR_TO_ORDER = {
-     0: 255,  # '\x00'
-     1: 255,  # '\x01'
-     2: 255,  # '\x02'
-     3: 255,  # '\x03'
-     4: 255,  # '\x04'
-     5: 255,  # '\x05'
-     6: 255,  # '\x06'
-     7: 255,  # '\x07'
-     8: 255,  # '\x08'
-     9: 255,  # '\t'
-     10: 255,  # '\n'
-     11: 255,  # '\x0b'
-     12: 255,  # '\x0c'
-     13: 255,  # '\r'
-     14: 255,  # '\x0e'
-     15: 255,  # '\x0f'
-     16: 255,  # '\x10'
-     17: 255,  # '\x11'
-     18: 255,  # '\x12'
-     19: 255,  # '\x13'
-     20: 255,  # '\x14'
-     21: 255,  # '\x15'
-     22: 255,  # '\x16'
-     23: 255,  # '\x17'
-     24: 255,  # '\x18'
-     25: 255,  # '\x19'
-     26: 255,  # '\x1a'
-     27: 255,  # '\x1b'
-     28: 255,  # '\x1c'
-     29: 255,  # '\x1d'
-     30: 255,  # '\x1e'
-     31: 255,  # '\x1f'
-     32: 255,  # ' '
-     33: 255,  # '!'
-     34: 255,  # '"'
-     35: 255,  # '#'
-     36: 255,  # '$'
-     37: 255,  # '%'
-     38: 255,  # '&'
-     39: 255,  # "'"
-     40: 255,  # '('
-     41: 255,  # ')'
-     42: 255,  # '*'
-     43: 255,  # '+'
-     44: 255,  # ','
-     45: 255,  # '-'
-     46: 255,  # '.'
-     47: 255,  # '/'
-     48: 255,  # '0'
-     49: 255,  # '1'
-     50: 255,  # '2'
-     51: 255,  # '3'
-     52: 255,  # '4'
-     53: 255,  # '5'
-     54: 255,  # '6'
-     55: 255,  # '7'
-     56: 255,  # '8'
-     57: 255,  # '9'
-     58: 255,  # ':'
-     59: 255,  # ';'
-     60: 255,  # '<'
-     61: 255,  # '='
-     62: 255,  # '>'
-     63: 255,  # '?'
-     64: 255,  # '@'
-     65: 23,  # 'A'
-     66: 37,  # 'B'
-     67: 47,  # 'C'
-     68: 39,  # 'D'
-     69: 29,  # 'E'
-     70: 52,  # 'F'
-     71: 36,  # 'G'
-     72: 45,  # 'H'
-     73: 53,  # 'I'
-     74: 60,  # 'J'
-     75: 16,  # 'K'
-     76: 49,  # 'L'
-     77: 20,  # 'M'
-     78: 46,  # 'N'
-     79: 42,  # 'O'
-     80: 48,  # 'P'
-     81: 69,  # 'Q'
-     82: 44,  # 'R'
-     83: 35,  # 'S'
-     84: 31,  # 'T'
-     85: 51,  # 'U'
-     86: 38,  # 'V'
-     87: 62,  # 'W'
-     88: 65,  # 'X'
-     89: 43,  # 'Y'
-     90: 56,  # 'Z'
-     91: 255,  # '['
-     92: 255,  # '\\'
-     93: 255,  # ']'
-     94: 255,  # '^'
-     95: 255,  # '_'
-     96: 255,  # '`'
-     97: 1,  # 'a'
-     98: 21,  # 'b'
-     99: 28,  # 'c'
-     100: 12,  # 'd'
-     101: 2,  # 'e'
-     102: 18,  # 'f'
-     103: 27,  # 'g'
-     104: 25,  # 'h'
-     105: 3,  # 'i'
-     106: 24,  # 'j'
-     107: 10,  # 'k'
-     108: 5,  # 'l'
-     109: 13,  # 'm'
-     110: 4,  # 'n'
-     111: 15,  # 'o'
-     112: 26,  # 'p'
-     113: 64,  # 'q'
-     114: 7,  # 'r'
-     115: 8,  # 's'
-     116: 9,  # 't'
-     117: 14,  # 'u'
-     118: 32,  # 'v'
-     119: 57,  # 'w'
-     120: 58,  # 'x'
-     121: 11,  # 'y'
-     122: 22,  # 'z'
-     123: 255,  # '{'
-     124: 255,  # '|'
-     125: 255,  # '}'
-     126: 255,  # '~'
-     127: 255,  # '\x7f'
-     128: 180,  # '\x80'
-     129: 179,  # '\x81'
-     130: 178,  # '\x82'
-     131: 177,  # '\x83'
-     132: 176,  # '\x84'
-     133: 175,  # '\x85'
-     134: 174,  # '\x86'
-     135: 173,  # '\x87'
-     136: 172,  # '\x88'
-     137: 171,  # '\x89'
-     138: 170,  # '\x8a'
-     139: 169,  # '\x8b'
-     140: 168,  # '\x8c'
-     141: 167,  # '\x8d'
-     142: 166,  # '\x8e'
-     143: 165,  # '\x8f'
-     144: 164,  # '\x90'
-     145: 163,  # '\x91'
-     146: 162,  # '\x92'
-     147: 161,  # '\x93'
-     148: 160,  # '\x94'
-     149: 159,  # '\x95'
-     150: 101,  # '\x96'
-     151: 158,  # '\x97'
-     152: 157,  # '\x98'
-     153: 156,  # '\x99'
-     154: 155,  # '\x9a'
-     155: 154,  # '\x9b'
-     156: 153,  # '\x9c'
-     157: 152,  # '\x9d'
-     158: 151,  # '\x9e'
-     159: 106,  # '\x9f'
-     160: 150,  # '\xa0'
-     161: 149,  # '¡'
-     162: 148,  # '¢'
-     163: 147,  # '£'
-     164: 146,  # '¤'
-     165: 145,  # 'Â¥'
-     166: 144,  # '¦'
-     167: 100,  # '§'
-     168: 143,  # '¨'
-     169: 142,  # '©'
-     170: 141,  # 'ª'
-     171: 140,  # '«'
-     172: 139,  # '¬'
-     173: 138,  # '\xad'
-     174: 137,  # '®'
-     175: 136,  # '¯'
-     176: 94,  # '°'
-     177: 80,  # '±'
-     178: 93,  # '²'
-     179: 135,  # '³'
-     180: 105,  # '´'
-     181: 134,  # 'µ'
-     182: 133,  # '¶'
-     183: 63,  # '·'
-     184: 132,  # '¸'
-     185: 131,  # '¹'
-     186: 130,  # 'º'
-     187: 129,  # '»'
-     188: 128,  # '¼'
-     189: 127,  # '½'
-     190: 126,  # '¾'
-     191: 125,  # '¿'
-     192: 124,  # 'À'
-     193: 104,  # 'Ã'
-     194: 73,  # 'Â'
-     195: 99,  # 'Ã'
-     196: 79,  # 'Ä'
-     197: 85,  # 'Ã…'
-     198: 123,  # 'Æ'
-     199: 54,  # 'Ç'
-     200: 122,  # 'È'
-     201: 98,  # 'É'
-     202: 92,  # 'Ê'
-     203: 121,  # 'Ë'
-     204: 120,  # 'Ì'
-     205: 91,  # 'Ã'
-     206: 103,  # 'ÃŽ'
-     207: 119,  # 'Ã'
-     208: 68,  # 'Äž'
-     209: 118,  # 'Ñ'
-     210: 117,  # 'Ã’'
-     211: 97,  # 'Ó'
-     212: 116,  # 'Ô'
-     213: 115,  # 'Õ'
-     214: 50,  # 'Ö'
-     215: 90,  # '×'
-     216: 114,  # 'Ø'
-     217: 113,  # 'Ù'
-     218: 112,  # 'Ú'
-     219: 111,  # 'Û'
-     220: 55,  # 'Ü'
-     221: 41,  # 'İ'
-     222: 40,  # 'Åž'
-     223: 86,  # 'ß'
-     224: 89,  # 'à'
-     225: 70,  # 'á'
-     226: 59,  # 'â'
-     227: 78,  # 'ã'
-     228: 71,  # 'ä'
-     229: 82,  # 'Ã¥'
-     230: 88,  # 'æ'
-     231: 33,  # 'ç'
-     232: 77,  # 'è'
-     233: 66,  # 'é'
-     234: 84,  # 'ê'
-     235: 83,  # 'ë'
-     236: 110,  # 'ì'
-     237: 75,  # 'í'
-     238: 61,  # 'î'
-     239: 96,  # 'ï'
-     240: 30,  # 'ÄŸ'
-     241: 67,  # 'ñ'
-     242: 109,  # 'ò'
-     243: 74,  # 'ó'
-     244: 87,  # 'ô'
-     245: 102,  # 'õ'
-     246: 34,  # 'ö'
-     247: 95,  # '÷'
-     248: 81,  # 'ø'
-     249: 108,  # 'ù'
-     250: 76,  # 'ú'
-     251: 72,  # 'û'
-     252: 17,  # 'ü'
-     253: 6,  # 'ı'
-     254: 19,  # 'ÅŸ'
-     255: 107,  # 'ÿ'
-}
-
-ISO_8859_9_TURKISH_MODEL = SingleByteCharSetModel(charset_name='ISO-8859-9',
-                                                  language='Turkish',
-                                                  char_to_order_map=ISO_8859_9_TURKISH_CHAR_TO_ORDER,
-                                                  language_model=TURKISH_LANG_MODEL,
-                                                  typical_positive_ratio=0.97029,
-                                                  keep_ascii_letters=True,
-                                                  alphabet='ABCDEFGHIJKLMNOPRSTUVYZabcdefghijklmnoprstuvyzÂÇÎÖÛÜâçîöûüĞğİıŞş')
-
diff --git a/lib/sub_repos/chardet/chardet/latin1prober.py b/lib/sub_repos/chardet/chardet/latin1prober.py
deleted file mode 100644
index 7d1e8c20f..000000000
--- a/lib/sub_repos/chardet/chardet/latin1prober.py
+++ /dev/null
@@ -1,145 +0,0 @@
-######################## BEGIN LICENSE BLOCK ########################
-# The Original Code is Mozilla Universal charset detector code.
-#
-# The Initial Developer of the Original Code is
-# Netscape Communications Corporation.
-# Portions created by the Initial Developer are Copyright (C) 2001
-# the Initial Developer. All Rights Reserved.
-#
-# Contributor(s):
-#   Mark Pilgrim - port to Python
-#   Shy Shalom - original C code
-#
-# This library is free software; you can redistribute it and/or
-# modify it under the terms of the GNU Lesser General Public
-# License as published by the Free Software Foundation; either
-# version 2.1 of the License, or (at your option) any later version.
-#
-# This library is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-# Lesser General Public License for more details.
-#
-# You should have received a copy of the GNU Lesser General Public
-# License along with this library; if not, write to the Free Software
-# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
-# 02110-1301  USA
-######################### END LICENSE BLOCK #########################
-
-from .charsetprober import CharSetProber
-from .enums import ProbingState
-
-FREQ_CAT_NUM = 4
-
-UDF = 0  # undefined
-OTH = 1  # other
-ASC = 2  # ascii capital letter
-ASS = 3  # ascii small letter
-ACV = 4  # accent capital vowel
-ACO = 5  # accent capital other
-ASV = 6  # accent small vowel
-ASO = 7  # accent small other
-CLASS_NUM = 8  # total classes
-
-Latin1_CharToClass = (
-    OTH, OTH, OTH, OTH, OTH, OTH, OTH, OTH,   # 00 - 07
-    OTH, OTH, OTH, OTH, OTH, OTH, OTH, OTH,   # 08 - 0F
-    OTH, OTH, OTH, OTH, OTH, OTH, OTH, OTH,   # 10 - 17
-    OTH, OTH, OTH, OTH, OTH, OTH, OTH, OTH,   # 18 - 1F
-    OTH, OTH, OTH, OTH, OTH, OTH, OTH, OTH,   # 20 - 27
-    OTH, OTH, OTH, OTH, OTH, OTH, OTH, OTH,   # 28 - 2F
-    OTH, OTH, OTH, OTH, OTH, OTH, OTH, OTH,   # 30 - 37
-    OTH, OTH, OTH, OTH, OTH, OTH, OTH, OTH,   # 38 - 3F
-    OTH, ASC, ASC, ASC, ASC, ASC, ASC, ASC,   # 40 - 47
-    ASC, ASC, ASC, ASC, ASC, ASC, ASC, ASC,   # 48 - 4F
-    ASC, ASC, ASC, ASC, ASC, ASC, ASC, ASC,   # 50 - 57
-    ASC, ASC, ASC, OTH, OTH, OTH, OTH, OTH,   # 58 - 5F
-    OTH, ASS, ASS, ASS, ASS, ASS, ASS, ASS,   # 60 - 67
-    ASS, ASS, ASS, ASS, ASS, ASS, ASS, ASS,   # 68 - 6F
-    ASS, ASS, ASS, ASS, ASS, ASS, ASS, ASS,   # 70 - 77
-    ASS, ASS, ASS, OTH, OTH, OTH, OTH, OTH,   # 78 - 7F
-    OTH, UDF, OTH, ASO, OTH, OTH, OTH, OTH,   # 80 - 87
-    OTH, OTH, ACO, OTH, ACO, UDF, ACO, UDF,   # 88 - 8F
-    UDF, OTH, OTH, OTH, OTH, OTH, OTH, OTH,   # 90 - 97
-    OTH, OTH, ASO, OTH, ASO, UDF, ASO, ACO,   # 98 - 9F
-    OTH, OTH, OTH, OTH, OTH, OTH, OTH, OTH,   # A0 - A7
-    OTH, OTH, OTH, OTH, OTH, OTH, OTH, OTH,   # A8 - AF
-    OTH, OTH, OTH, OTH, OTH, OTH, OTH, OTH,   # B0 - B7
-    OTH, OTH, OTH, OTH, OTH, OTH, OTH, OTH,   # B8 - BF
-    ACV, ACV, ACV, ACV, ACV, ACV, ACO, ACO,   # C0 - C7
-    ACV, ACV, ACV, ACV, ACV, ACV, ACV, ACV,   # C8 - CF
-    ACO, ACO, ACV, ACV, ACV, ACV, ACV, OTH,   # D0 - D7
-    ACV, ACV, ACV, ACV, ACV, ACO, ACO, ACO,   # D8 - DF
-    ASV, ASV, ASV, ASV, ASV, ASV, ASO, ASO,   # E0 - E7
-    ASV, ASV, ASV, ASV, ASV, ASV, ASV, ASV,   # E8 - EF
-    ASO, ASO, ASV, ASV, ASV, ASV, ASV, OTH,   # F0 - F7
-    ASV, ASV, ASV, ASV, ASV, ASO, ASO, ASO,   # F8 - FF
-)
-
-# 0 : illegal
-# 1 : very unlikely
-# 2 : normal
-# 3 : very likely
-Latin1ClassModel = (
-# UDF OTH ASC ASS ACV ACO ASV ASO
-    0,  0,  0,  0,  0,  0,  0,  0,  # UDF
-    0,  3,  3,  3,  3,  3,  3,  3,  # OTH
-    0,  3,  3,  3,  3,  3,  3,  3,  # ASC
-    0,  3,  3,  3,  1,  1,  3,  3,  # ASS
-    0,  3,  3,  3,  1,  2,  1,  2,  # ACV
-    0,  3,  3,  3,  3,  3,  3,  3,  # ACO
-    0,  3,  1,  3,  1,  1,  1,  3,  # ASV
-    0,  3,  1,  3,  1,  1,  3,  3,  # ASO
-)
-
-
-class Latin1Prober(CharSetProber):
-    def __init__(self):
-        super(Latin1Prober, self).__init__()
-        self._last_char_class = None
-        self._freq_counter = None
-        self.reset()
-
-    def reset(self):
-        self._last_char_class = OTH
-        self._freq_counter = [0] * FREQ_CAT_NUM
-        CharSetProber.reset(self)
-
-    @property
-    def charset_name(self):
-        return "ISO-8859-1"
-
-    @property
-    def language(self):
-        return ""
-
-    def feed(self, byte_str):
-        byte_str = self.filter_with_english_letters(byte_str)
-        for c in byte_str:
-            char_class = Latin1_CharToClass[c]
-            freq = Latin1ClassModel[(self._last_char_class * CLASS_NUM)
-                                    + char_class]
-            if freq == 0:
-                self._state = ProbingState.NOT_ME
-                break
-            self._freq_counter[freq] += 1
-            self._last_char_class = char_class
-
-        return self.state
-
-    def get_confidence(self):
-        if self.state == ProbingState.NOT_ME:
-            return 0.01
-
-        total = sum(self._freq_counter)
-        if total < 0.01:
-            confidence = 0.0
-        else:
-            confidence = ((self._freq_counter[3] - self._freq_counter[1] * 20.0)
-                          / total)
-        if confidence < 0.0:
-            confidence = 0.0
-        # lower the confidence of latin1 so that other more accurate
-        # detector can take priority.
-        confidence = confidence * 0.73
-        return confidence
diff --git a/lib/sub_repos/chardet/chardet/mbcharsetprober.py b/lib/sub_repos/chardet/chardet/mbcharsetprober.py
deleted file mode 100644
index 6256ecfd1..000000000
--- a/lib/sub_repos/chardet/chardet/mbcharsetprober.py
+++ /dev/null
@@ -1,91 +0,0 @@
-######################## BEGIN LICENSE BLOCK ########################
-# The Original Code is Mozilla Universal charset detector code.
-#
-# The Initial Developer of the Original Code is
-# Netscape Communications Corporation.
-# Portions created by the Initial Developer are Copyright (C) 2001
-# the Initial Developer. All Rights Reserved.
-#
-# Contributor(s):
-#   Mark Pilgrim - port to Python
-#   Shy Shalom - original C code
-#   Proofpoint, Inc.
-#
-# This library is free software; you can redistribute it and/or
-# modify it under the terms of the GNU Lesser General Public
-# License as published by the Free Software Foundation; either
-# version 2.1 of the License, or (at your option) any later version.
-#
-# This library is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-# Lesser General Public License for more details.
-#
-# You should have received a copy of the GNU Lesser General Public
-# License along with this library; if not, write to the Free Software
-# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
-# 02110-1301  USA
-######################### END LICENSE BLOCK #########################
-
-from .charsetprober import CharSetProber
-from .enums import ProbingState, MachineState
-
-
-class MultiByteCharSetProber(CharSetProber):
-    """
-    MultiByteCharSetProber
-    """
-
-    def __init__(self, lang_filter=None):
-        super(MultiByteCharSetProber, self).__init__(lang_filter=lang_filter)
-        self.distribution_analyzer = None
-        self.coding_sm = None
-        self._last_char = [0, 0]
-
-    def reset(self):
-        super(MultiByteCharSetProber, self).reset()
-        if self.coding_sm:
-            self.coding_sm.reset()
-        if self.distribution_analyzer:
-            self.distribution_analyzer.reset()
-        self._last_char = [0, 0]
-
-    @property
-    def charset_name(self):
-        raise NotImplementedError
-
-    @property
-    def language(self):
-        raise NotImplementedError
-
-    def feed(self, byte_str):
-        for i in range(len(byte_str)):
-            coding_state = self.coding_sm.next_state(byte_str[i])
-            if coding_state == MachineState.ERROR:
-                self.logger.debug('%s %s prober hit error at byte %s',
-                                  self.charset_name, self.language, i)
-                self._state = ProbingState.NOT_ME
-                break
-            elif coding_state == MachineState.ITS_ME:
-                self._state = ProbingState.FOUND_IT
-                break
-            elif coding_state == MachineState.START:
-                char_len = self.coding_sm.get_current_charlen()
-                if i == 0:
-                    self._last_char[1] = byte_str[0]
-                    self.distribution_analyzer.feed(self._last_char, char_len)
-                else:
-                    self.distribution_analyzer.feed(byte_str[i - 1:i + 1],
-                                                    char_len)
-
-        self._last_char[0] = byte_str[-1]
-
-        if self.state == ProbingState.DETECTING:
-            if (self.distribution_analyzer.got_enough_data() and
-                    (self.get_confidence() > self.SHORTCUT_THRESHOLD)):
-                self._state = ProbingState.FOUND_IT
-
-        return self.state
-
-    def get_confidence(self):
-        return self.distribution_analyzer.get_confidence()
diff --git a/lib/sub_repos/chardet/chardet/mbcsgroupprober.py b/lib/sub_repos/chardet/chardet/mbcsgroupprober.py
deleted file mode 100644
index 530abe75e..000000000
--- a/lib/sub_repos/chardet/chardet/mbcsgroupprober.py
+++ /dev/null
@@ -1,54 +0,0 @@
-######################## BEGIN LICENSE BLOCK ########################
-# The Original Code is Mozilla Universal charset detector code.
-#
-# The Initial Developer of the Original Code is
-# Netscape Communications Corporation.
-# Portions created by the Initial Developer are Copyright (C) 2001
-# the Initial Developer. All Rights Reserved.
-#
-# Contributor(s):
-#   Mark Pilgrim - port to Python
-#   Shy Shalom - original C code
-#   Proofpoint, Inc.
-#
-# This library is free software; you can redistribute it and/or
-# modify it under the terms of the GNU Lesser General Public
-# License as published by the Free Software Foundation; either
-# version 2.1 of the License, or (at your option) any later version.
-#
-# This library is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-# Lesser General Public License for more details.
-#
-# You should have received a copy of the GNU Lesser General Public
-# License along with this library; if not, write to the Free Software
-# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
-# 02110-1301  USA
-######################### END LICENSE BLOCK #########################
-
-from .charsetgroupprober import CharSetGroupProber
-from .utf8prober import UTF8Prober
-from .sjisprober import SJISProber
-from .eucjpprober import EUCJPProber
-from .gb2312prober import GB2312Prober
-from .euckrprober import EUCKRProber
-from .cp949prober import CP949Prober
-from .big5prober import Big5Prober
-from .euctwprober import EUCTWProber
-
-
-class MBCSGroupProber(CharSetGroupProber):
-    def __init__(self, lang_filter=None):
-        super(MBCSGroupProber, self).__init__(lang_filter=lang_filter)
-        self.probers = [
-            UTF8Prober(),
-            SJISProber(),
-            EUCJPProber(),
-            GB2312Prober(),
-            EUCKRProber(),
-            CP949Prober(),
-            Big5Prober(),
-            EUCTWProber()
-        ]
-        self.reset()
diff --git a/lib/sub_repos/chardet/chardet/mbcssm.py b/lib/sub_repos/chardet/chardet/mbcssm.py
deleted file mode 100644
index 8360d0f28..000000000
--- a/lib/sub_repos/chardet/chardet/mbcssm.py
+++ /dev/null
@@ -1,572 +0,0 @@
-######################## BEGIN LICENSE BLOCK ########################
-# The Original Code is mozilla.org code.
-#
-# The Initial Developer of the Original Code is
-# Netscape Communications Corporation.
-# Portions created by the Initial Developer are Copyright (C) 1998
-# the Initial Developer. All Rights Reserved.
-#
-# Contributor(s):
-#   Mark Pilgrim - port to Python
-#
-# This library is free software; you can redistribute it and/or
-# modify it under the terms of the GNU Lesser General Public
-# License as published by the Free Software Foundation; either
-# version 2.1 of the License, or (at your option) any later version.
-#
-# This library is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-# Lesser General Public License for more details.
-#
-# You should have received a copy of the GNU Lesser General Public
-# License along with this library; if not, write to the Free Software
-# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
-# 02110-1301  USA
-######################### END LICENSE BLOCK #########################
-
-from .enums import MachineState
-
-# BIG5
-
-BIG5_CLS = (
-    1,1,1,1,1,1,1,1,  # 00 - 07    #allow 0x00 as legal value
-    1,1,1,1,1,1,0,0,  # 08 - 0f
-    1,1,1,1,1,1,1,1,  # 10 - 17
-    1,1,1,0,1,1,1,1,  # 18 - 1f
-    1,1,1,1,1,1,1,1,  # 20 - 27
-    1,1,1,1,1,1,1,1,  # 28 - 2f
-    1,1,1,1,1,1,1,1,  # 30 - 37
-    1,1,1,1,1,1,1,1,  # 38 - 3f
-    2,2,2,2,2,2,2,2,  # 40 - 47
-    2,2,2,2,2,2,2,2,  # 48 - 4f
-    2,2,2,2,2,2,2,2,  # 50 - 57
-    2,2,2,2,2,2,2,2,  # 58 - 5f
-    2,2,2,2,2,2,2,2,  # 60 - 67
-    2,2,2,2,2,2,2,2,  # 68 - 6f
-    2,2,2,2,2,2,2,2,  # 70 - 77
-    2,2,2,2,2,2,2,1,  # 78 - 7f
-    4,4,4,4,4,4,4,4,  # 80 - 87
-    4,4,4,4,4,4,4,4,  # 88 - 8f
-    4,4,4,4,4,4,4,4,  # 90 - 97
-    4,4,4,4,4,4,4,4,  # 98 - 9f
-    4,3,3,3,3,3,3,3,  # a0 - a7
-    3,3,3,3,3,3,3,3,  # a8 - af
-    3,3,3,3,3,3,3,3,  # b0 - b7
-    3,3,3,3,3,3,3,3,  # b8 - bf
-    3,3,3,3,3,3,3,3,  # c0 - c7
-    3,3,3,3,3,3,3,3,  # c8 - cf
-    3,3,3,3,3,3,3,3,  # d0 - d7
-    3,3,3,3,3,3,3,3,  # d8 - df
-    3,3,3,3,3,3,3,3,  # e0 - e7
-    3,3,3,3,3,3,3,3,  # e8 - ef
-    3,3,3,3,3,3,3,3,  # f0 - f7
-    3,3,3,3,3,3,3,0  # f8 - ff
-)
-
-BIG5_ST = (
-    MachineState.ERROR,MachineState.START,MachineState.START,     3,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,#00-07
-    MachineState.ERROR,MachineState.ERROR,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ERROR,#08-0f
-    MachineState.ERROR,MachineState.START,MachineState.START,MachineState.START,MachineState.START,MachineState.START,MachineState.START,MachineState.START#10-17
-)
-
-BIG5_CHAR_LEN_TABLE = (0, 1, 1, 2, 0)
-
-BIG5_SM_MODEL = {'class_table': BIG5_CLS,
-                 'class_factor': 5,
-                 'state_table': BIG5_ST,
-                 'char_len_table': BIG5_CHAR_LEN_TABLE,
-                 'name': 'Big5'}
-
-# CP949
-
-CP949_CLS  = (
-    1,1,1,1,1,1,1,1, 1,1,1,1,1,1,0,0,  # 00 - 0f
-    1,1,1,1,1,1,1,1, 1,1,1,0,1,1,1,1,  # 10 - 1f
-    1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,  # 20 - 2f
-    1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,  # 30 - 3f
-    1,4,4,4,4,4,4,4, 4,4,4,4,4,4,4,4,  # 40 - 4f
-    4,4,5,5,5,5,5,5, 5,5,5,1,1,1,1,1,  # 50 - 5f
-    1,5,5,5,5,5,5,5, 5,5,5,5,5,5,5,5,  # 60 - 6f
-    5,5,5,5,5,5,5,5, 5,5,5,1,1,1,1,1,  # 70 - 7f
-    0,6,6,6,6,6,6,6, 6,6,6,6,6,6,6,6,  # 80 - 8f
-    6,6,6,6,6,6,6,6, 6,6,6,6,6,6,6,6,  # 90 - 9f
-    6,7,7,7,7,7,7,7, 7,7,7,7,7,8,8,8,  # a0 - af
-    7,7,7,7,7,7,7,7, 7,7,7,7,7,7,7,7,  # b0 - bf
-    7,7,7,7,7,7,9,2, 2,3,2,2,2,2,2,2,  # c0 - cf
-    2,2,2,2,2,2,2,2, 2,2,2,2,2,2,2,2,  # d0 - df
-    2,2,2,2,2,2,2,2, 2,2,2,2,2,2,2,2,  # e0 - ef
-    2,2,2,2,2,2,2,2, 2,2,2,2,2,2,2,0,  # f0 - ff
-)
-
-CP949_ST = (
-#cls=    0      1      2      3      4      5      6      7      8      9  # previous state =
-    MachineState.ERROR,MachineState.START,     3,MachineState.ERROR,MachineState.START,MachineState.START,     4,     5,MachineState.ERROR,     6, # MachineState.START
-    MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR, # MachineState.ERROR
-    MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME, # MachineState.ITS_ME
-    MachineState.ERROR,MachineState.ERROR,MachineState.START,MachineState.START,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.START,MachineState.START,MachineState.START, # 3
-    MachineState.ERROR,MachineState.ERROR,MachineState.START,MachineState.START,MachineState.START,MachineState.START,MachineState.START,MachineState.START,MachineState.START,MachineState.START, # 4
-    MachineState.ERROR,MachineState.START,MachineState.START,MachineState.START,MachineState.START,MachineState.START,MachineState.START,MachineState.START,MachineState.START,MachineState.START, # 5
-    MachineState.ERROR,MachineState.START,MachineState.START,MachineState.START,MachineState.START,MachineState.ERROR,MachineState.ERROR,MachineState.START,MachineState.START,MachineState.START, # 6
-)
-
-CP949_CHAR_LEN_TABLE = (0, 1, 2, 0, 1, 1, 2, 2, 0, 2)
-
-CP949_SM_MODEL = {'class_table': CP949_CLS,
-                  'class_factor': 10,
-                  'state_table': CP949_ST,
-                  'char_len_table': CP949_CHAR_LEN_TABLE,
-                  'name': 'CP949'}
-
-# EUC-JP
-
-EUCJP_CLS = (
-    4,4,4,4,4,4,4,4,  # 00 - 07
-    4,4,4,4,4,4,5,5,  # 08 - 0f
-    4,4,4,4,4,4,4,4,  # 10 - 17
-    4,4,4,5,4,4,4,4,  # 18 - 1f
-    4,4,4,4,4,4,4,4,  # 20 - 27
-    4,4,4,4,4,4,4,4,  # 28 - 2f
-    4,4,4,4,4,4,4,4,  # 30 - 37
-    4,4,4,4,4,4,4,4,  # 38 - 3f
-    4,4,4,4,4,4,4,4,  # 40 - 47
-    4,4,4,4,4,4,4,4,  # 48 - 4f
-    4,4,4,4,4,4,4,4,  # 50 - 57
-    4,4,4,4,4,4,4,4,  # 58 - 5f
-    4,4,4,4,4,4,4,4,  # 60 - 67
-    4,4,4,4,4,4,4,4,  # 68 - 6f
-    4,4,4,4,4,4,4,4,  # 70 - 77
-    4,4,4,4,4,4,4,4,  # 78 - 7f
-    5,5,5,5,5,5,5,5,  # 80 - 87
-    5,5,5,5,5,5,1,3,  # 88 - 8f
-    5,5,5,5,5,5,5,5,  # 90 - 97
-    5,5,5,5,5,5,5,5,  # 98 - 9f
-    5,2,2,2,2,2,2,2,  # a0 - a7
-    2,2,2,2,2,2,2,2,  # a8 - af
-    2,2,2,2,2,2,2,2,  # b0 - b7
-    2,2,2,2,2,2,2,2,  # b8 - bf
-    2,2,2,2,2,2,2,2,  # c0 - c7
-    2,2,2,2,2,2,2,2,  # c8 - cf
-    2,2,2,2,2,2,2,2,  # d0 - d7
-    2,2,2,2,2,2,2,2,  # d8 - df
-    0,0,0,0,0,0,0,0,  # e0 - e7
-    0,0,0,0,0,0,0,0,  # e8 - ef
-    0,0,0,0,0,0,0,0,  # f0 - f7
-    0,0,0,0,0,0,0,5  # f8 - ff
-)
-
-EUCJP_ST = (
-          3,     4,     3,     5,MachineState.START,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,#00-07
-     MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,#08-0f
-     MachineState.ITS_ME,MachineState.ITS_ME,MachineState.START,MachineState.ERROR,MachineState.START,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,#10-17
-     MachineState.ERROR,MachineState.ERROR,MachineState.START,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,     3,MachineState.ERROR,#18-1f
-          3,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.START,MachineState.START,MachineState.START,MachineState.START#20-27
-)
-
-EUCJP_CHAR_LEN_TABLE = (2, 2, 2, 3, 1, 0)
-
-EUCJP_SM_MODEL = {'class_table': EUCJP_CLS,
-                  'class_factor': 6,
-                  'state_table': EUCJP_ST,
-                  'char_len_table': EUCJP_CHAR_LEN_TABLE,
-                  'name': 'EUC-JP'}
-
-# EUC-KR
-
-EUCKR_CLS  = (
-    1,1,1,1,1,1,1,1,  # 00 - 07
-    1,1,1,1,1,1,0,0,  # 08 - 0f
-    1,1,1,1,1,1,1,1,  # 10 - 17
-    1,1,1,0,1,1,1,1,  # 18 - 1f
-    1,1,1,1,1,1,1,1,  # 20 - 27
-    1,1,1,1,1,1,1,1,  # 28 - 2f
-    1,1,1,1,1,1,1,1,  # 30 - 37
-    1,1,1,1,1,1,1,1,  # 38 - 3f
-    1,1,1,1,1,1,1,1,  # 40 - 47
-    1,1,1,1,1,1,1,1,  # 48 - 4f
-    1,1,1,1,1,1,1,1,  # 50 - 57
-    1,1,1,1,1,1,1,1,  # 58 - 5f
-    1,1,1,1,1,1,1,1,  # 60 - 67
-    1,1,1,1,1,1,1,1,  # 68 - 6f
-    1,1,1,1,1,1,1,1,  # 70 - 77
-    1,1,1,1,1,1,1,1,  # 78 - 7f
-    0,0,0,0,0,0,0,0,  # 80 - 87
-    0,0,0,0,0,0,0,0,  # 88 - 8f
-    0,0,0,0,0,0,0,0,  # 90 - 97
-    0,0,0,0,0,0,0,0,  # 98 - 9f
-    0,2,2,2,2,2,2,2,  # a0 - a7
-    2,2,2,2,2,3,3,3,  # a8 - af
-    2,2,2,2,2,2,2,2,  # b0 - b7
-    2,2,2,2,2,2,2,2,  # b8 - bf
-    2,2,2,2,2,2,2,2,  # c0 - c7
-    2,3,2,2,2,2,2,2,  # c8 - cf
-    2,2,2,2,2,2,2,2,  # d0 - d7
-    2,2,2,2,2,2,2,2,  # d8 - df
-    2,2,2,2,2,2,2,2,  # e0 - e7
-    2,2,2,2,2,2,2,2,  # e8 - ef
-    2,2,2,2,2,2,2,2,  # f0 - f7
-    2,2,2,2,2,2,2,0   # f8 - ff
-)
-
-EUCKR_ST = (
-    MachineState.ERROR,MachineState.START,     3,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,#00-07
-    MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ERROR,MachineState.ERROR,MachineState.START,MachineState.START #08-0f
-)
-
-EUCKR_CHAR_LEN_TABLE = (0, 1, 2, 0)
-
-EUCKR_SM_MODEL = {'class_table': EUCKR_CLS,
-                'class_factor': 4,
-                'state_table': EUCKR_ST,
-                'char_len_table': EUCKR_CHAR_LEN_TABLE,
-                'name': 'EUC-KR'}
-
-# EUC-TW
-
-EUCTW_CLS = (
-    2,2,2,2,2,2,2,2,  # 00 - 07
-    2,2,2,2,2,2,0,0,  # 08 - 0f
-    2,2,2,2,2,2,2,2,  # 10 - 17
-    2,2,2,0,2,2,2,2,  # 18 - 1f
-    2,2,2,2,2,2,2,2,  # 20 - 27
-    2,2,2,2,2,2,2,2,  # 28 - 2f
-    2,2,2,2,2,2,2,2,  # 30 - 37
-    2,2,2,2,2,2,2,2,  # 38 - 3f
-    2,2,2,2,2,2,2,2,  # 40 - 47
-    2,2,2,2,2,2,2,2,  # 48 - 4f
-    2,2,2,2,2,2,2,2,  # 50 - 57
-    2,2,2,2,2,2,2,2,  # 58 - 5f
-    2,2,2,2,2,2,2,2,  # 60 - 67
-    2,2,2,2,2,2,2,2,  # 68 - 6f
-    2,2,2,2,2,2,2,2,  # 70 - 77
-    2,2,2,2,2,2,2,2,  # 78 - 7f
-    0,0,0,0,0,0,0,0,  # 80 - 87
-    0,0,0,0,0,0,6,0,  # 88 - 8f
-    0,0,0,0,0,0,0,0,  # 90 - 97
-    0,0,0,0,0,0,0,0,  # 98 - 9f
-    0,3,4,4,4,4,4,4,  # a0 - a7
-    5,5,1,1,1,1,1,1,  # a8 - af
-    1,1,1,1,1,1,1,1,  # b0 - b7
-    1,1,1,1,1,1,1,1,  # b8 - bf
-    1,1,3,1,3,3,3,3,  # c0 - c7
-    3,3,3,3,3,3,3,3,  # c8 - cf
-    3,3,3,3,3,3,3,3,  # d0 - d7
-    3,3,3,3,3,3,3,3,  # d8 - df
-    3,3,3,3,3,3,3,3,  # e0 - e7
-    3,3,3,3,3,3,3,3,  # e8 - ef
-    3,3,3,3,3,3,3,3,  # f0 - f7
-    3,3,3,3,3,3,3,0   # f8 - ff
-)
-
-EUCTW_ST = (
-    MachineState.ERROR,MachineState.ERROR,MachineState.START,     3,     3,     3,     4,MachineState.ERROR,#00-07
-    MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ITS_ME,MachineState.ITS_ME,#08-0f
-    MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ERROR,MachineState.START,MachineState.ERROR,#10-17
-    MachineState.START,MachineState.START,MachineState.START,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,#18-1f
-         5,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.START,MachineState.ERROR,MachineState.START,MachineState.START,#20-27
-    MachineState.START,MachineState.ERROR,MachineState.START,MachineState.START,MachineState.START,MachineState.START,MachineState.START,MachineState.START #28-2f
-)
-
-EUCTW_CHAR_LEN_TABLE = (0, 0, 1, 2, 2, 2, 3)
-
-EUCTW_SM_MODEL = {'class_table': EUCTW_CLS,
-                'class_factor': 7,
-                'state_table': EUCTW_ST,
-                'char_len_table': EUCTW_CHAR_LEN_TABLE,
-                'name': 'x-euc-tw'}
-
-# GB2312
-
-GB2312_CLS = (
-    1,1,1,1,1,1,1,1,  # 00 - 07
-    1,1,1,1,1,1,0,0,  # 08 - 0f
-    1,1,1,1,1,1,1,1,  # 10 - 17
-    1,1,1,0,1,1,1,1,  # 18 - 1f
-    1,1,1,1,1,1,1,1,  # 20 - 27
-    1,1,1,1,1,1,1,1,  # 28 - 2f
-    3,3,3,3,3,3,3,3,  # 30 - 37
-    3,3,1,1,1,1,1,1,  # 38 - 3f
-    2,2,2,2,2,2,2,2,  # 40 - 47
-    2,2,2,2,2,2,2,2,  # 48 - 4f
-    2,2,2,2,2,2,2,2,  # 50 - 57
-    2,2,2,2,2,2,2,2,  # 58 - 5f
-    2,2,2,2,2,2,2,2,  # 60 - 67
-    2,2,2,2,2,2,2,2,  # 68 - 6f
-    2,2,2,2,2,2,2,2,  # 70 - 77
-    2,2,2,2,2,2,2,4,  # 78 - 7f
-    5,6,6,6,6,6,6,6,  # 80 - 87
-    6,6,6,6,6,6,6,6,  # 88 - 8f
-    6,6,6,6,6,6,6,6,  # 90 - 97
-    6,6,6,6,6,6,6,6,  # 98 - 9f
-    6,6,6,6,6,6,6,6,  # a0 - a7
-    6,6,6,6,6,6,6,6,  # a8 - af
-    6,6,6,6,6,6,6,6,  # b0 - b7
-    6,6,6,6,6,6,6,6,  # b8 - bf
-    6,6,6,6,6,6,6,6,  # c0 - c7
-    6,6,6,6,6,6,6,6,  # c8 - cf
-    6,6,6,6,6,6,6,6,  # d0 - d7
-    6,6,6,6,6,6,6,6,  # d8 - df
-    6,6,6,6,6,6,6,6,  # e0 - e7
-    6,6,6,6,6,6,6,6,  # e8 - ef
-    6,6,6,6,6,6,6,6,  # f0 - f7
-    6,6,6,6,6,6,6,0   # f8 - ff
-)
-
-GB2312_ST = (
-    MachineState.ERROR,MachineState.START,MachineState.START,MachineState.START,MachineState.START,MachineState.START,     3,MachineState.ERROR,#00-07
-    MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ITS_ME,MachineState.ITS_ME,#08-0f
-    MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ERROR,MachineState.ERROR,MachineState.START,#10-17
-         4,MachineState.ERROR,MachineState.START,MachineState.START,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,#18-1f
-    MachineState.ERROR,MachineState.ERROR,     5,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ITS_ME,MachineState.ERROR,#20-27
-    MachineState.ERROR,MachineState.ERROR,MachineState.START,MachineState.START,MachineState.START,MachineState.START,MachineState.START,MachineState.START #28-2f
-)
-
-# To be accurate, the length of class 6 can be either 2 or 4.
-# But it is not necessary to discriminate between the two since
-# it is used for frequency analysis only, and we are validating
-# each code range there as well. So it is safe to set it to be
-# 2 here.
-GB2312_CHAR_LEN_TABLE = (0, 1, 1, 1, 1, 1, 2)
-
-GB2312_SM_MODEL = {'class_table': GB2312_CLS,
-                   'class_factor': 7,
-                   'state_table': GB2312_ST,
-                   'char_len_table': GB2312_CHAR_LEN_TABLE,
-                   'name': 'GB2312'}
-
-# Shift_JIS
-
-SJIS_CLS = (
-    1,1,1,1,1,1,1,1,  # 00 - 07
-    1,1,1,1,1,1,0,0,  # 08 - 0f
-    1,1,1,1,1,1,1,1,  # 10 - 17
-    1,1,1,0,1,1,1,1,  # 18 - 1f
-    1,1,1,1,1,1,1,1,  # 20 - 27
-    1,1,1,1,1,1,1,1,  # 28 - 2f
-    1,1,1,1,1,1,1,1,  # 30 - 37
-    1,1,1,1,1,1,1,1,  # 38 - 3f
-    2,2,2,2,2,2,2,2,  # 40 - 47
-    2,2,2,2,2,2,2,2,  # 48 - 4f
-    2,2,2,2,2,2,2,2,  # 50 - 57
-    2,2,2,2,2,2,2,2,  # 58 - 5f
-    2,2,2,2,2,2,2,2,  # 60 - 67
-    2,2,2,2,2,2,2,2,  # 68 - 6f
-    2,2,2,2,2,2,2,2,  # 70 - 77
-    2,2,2,2,2,2,2,1,  # 78 - 7f
-    3,3,3,3,3,2,2,3,  # 80 - 87
-    3,3,3,3,3,3,3,3,  # 88 - 8f
-    3,3,3,3,3,3,3,3,  # 90 - 97
-    3,3,3,3,3,3,3,3,  # 98 - 9f
-    #0xa0 is illegal in sjis encoding, but some pages does
-    #contain such byte. We need to be more error forgiven.
-    2,2,2,2,2,2,2,2,  # a0 - a7
-    2,2,2,2,2,2,2,2,  # a8 - af
-    2,2,2,2,2,2,2,2,  # b0 - b7
-    2,2,2,2,2,2,2,2,  # b8 - bf
-    2,2,2,2,2,2,2,2,  # c0 - c7
-    2,2,2,2,2,2,2,2,  # c8 - cf
-    2,2,2,2,2,2,2,2,  # d0 - d7
-    2,2,2,2,2,2,2,2,  # d8 - df
-    3,3,3,3,3,3,3,3,  # e0 - e7
-    3,3,3,3,3,4,4,4,  # e8 - ef
-    3,3,3,3,3,3,3,3,  # f0 - f7
-    3,3,3,3,3,0,0,0)  # f8 - ff
-
-
-SJIS_ST = (
-    MachineState.ERROR,MachineState.START,MachineState.START,     3,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,#00-07
-    MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,#08-0f
-    MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ERROR,MachineState.ERROR,MachineState.START,MachineState.START,MachineState.START,MachineState.START #10-17
-)
-
-SJIS_CHAR_LEN_TABLE = (0, 1, 1, 2, 0, 0)
-
-SJIS_SM_MODEL = {'class_table': SJIS_CLS,
-               'class_factor': 6,
-               'state_table': SJIS_ST,
-               'char_len_table': SJIS_CHAR_LEN_TABLE,
-               'name': 'Shift_JIS'}
-
-# UCS2-BE
-
-UCS2BE_CLS = (
-    0,0,0,0,0,0,0,0,  # 00 - 07
-    0,0,1,0,0,2,0,0,  # 08 - 0f
-    0,0,0,0,0,0,0,0,  # 10 - 17
-    0,0,0,3,0,0,0,0,  # 18 - 1f
-    0,0,0,0,0,0,0,0,  # 20 - 27
-    0,3,3,3,3,3,0,0,  # 28 - 2f
-    0,0,0,0,0,0,0,0,  # 30 - 37
-    0,0,0,0,0,0,0,0,  # 38 - 3f
-    0,0,0,0,0,0,0,0,  # 40 - 47
-    0,0,0,0,0,0,0,0,  # 48 - 4f
-    0,0,0,0,0,0,0,0,  # 50 - 57
-    0,0,0,0,0,0,0,0,  # 58 - 5f
-    0,0,0,0,0,0,0,0,  # 60 - 67
-    0,0,0,0,0,0,0,0,  # 68 - 6f
-    0,0,0,0,0,0,0,0,  # 70 - 77
-    0,0,0,0,0,0,0,0,  # 78 - 7f
-    0,0,0,0,0,0,0,0,  # 80 - 87
-    0,0,0,0,0,0,0,0,  # 88 - 8f
-    0,0,0,0,0,0,0,0,  # 90 - 97
-    0,0,0,0,0,0,0,0,  # 98 - 9f
-    0,0,0,0,0,0,0,0,  # a0 - a7
-    0,0,0,0,0,0,0,0,  # a8 - af
-    0,0,0,0,0,0,0,0,  # b0 - b7
-    0,0,0,0,0,0,0,0,  # b8 - bf
-    0,0,0,0,0,0,0,0,  # c0 - c7
-    0,0,0,0,0,0,0,0,  # c8 - cf
-    0,0,0,0,0,0,0,0,  # d0 - d7
-    0,0,0,0,0,0,0,0,  # d8 - df
-    0,0,0,0,0,0,0,0,  # e0 - e7
-    0,0,0,0,0,0,0,0,  # e8 - ef
-    0,0,0,0,0,0,0,0,  # f0 - f7
-    0,0,0,0,0,0,4,5   # f8 - ff
-)
-
-UCS2BE_ST  = (
-          5,     7,     7,MachineState.ERROR,     4,     3,MachineState.ERROR,MachineState.ERROR,#00-07
-     MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,#08-0f
-     MachineState.ITS_ME,MachineState.ITS_ME,     6,     6,     6,     6,MachineState.ERROR,MachineState.ERROR,#10-17
-          6,     6,     6,     6,     6,MachineState.ITS_ME,     6,     6,#18-1f
-          6,     6,     6,     6,     5,     7,     7,MachineState.ERROR,#20-27
-          5,     8,     6,     6,MachineState.ERROR,     6,     6,     6,#28-2f
-          6,     6,     6,     6,MachineState.ERROR,MachineState.ERROR,MachineState.START,MachineState.START #30-37
-)
-
-UCS2BE_CHAR_LEN_TABLE = (2, 2, 2, 0, 2, 2)
-
-UCS2BE_SM_MODEL = {'class_table': UCS2BE_CLS,
-                   'class_factor': 6,
-                   'state_table': UCS2BE_ST,
-                   'char_len_table': UCS2BE_CHAR_LEN_TABLE,
-                   'name': 'UTF-16BE'}
-
-# UCS2-LE
-
-UCS2LE_CLS = (
-    0,0,0,0,0,0,0,0,  # 00 - 07
-    0,0,1,0,0,2,0,0,  # 08 - 0f
-    0,0,0,0,0,0,0,0,  # 10 - 17
-    0,0,0,3,0,0,0,0,  # 18 - 1f
-    0,0,0,0,0,0,0,0,  # 20 - 27
-    0,3,3,3,3,3,0,0,  # 28 - 2f
-    0,0,0,0,0,0,0,0,  # 30 - 37
-    0,0,0,0,0,0,0,0,  # 38 - 3f
-    0,0,0,0,0,0,0,0,  # 40 - 47
-    0,0,0,0,0,0,0,0,  # 48 - 4f
-    0,0,0,0,0,0,0,0,  # 50 - 57
-    0,0,0,0,0,0,0,0,  # 58 - 5f
-    0,0,0,0,0,0,0,0,  # 60 - 67
-    0,0,0,0,0,0,0,0,  # 68 - 6f
-    0,0,0,0,0,0,0,0,  # 70 - 77
-    0,0,0,0,0,0,0,0,  # 78 - 7f
-    0,0,0,0,0,0,0,0,  # 80 - 87
-    0,0,0,0,0,0,0,0,  # 88 - 8f
-    0,0,0,0,0,0,0,0,  # 90 - 97
-    0,0,0,0,0,0,0,0,  # 98 - 9f
-    0,0,0,0,0,0,0,0,  # a0 - a7
-    0,0,0,0,0,0,0,0,  # a8 - af
-    0,0,0,0,0,0,0,0,  # b0 - b7
-    0,0,0,0,0,0,0,0,  # b8 - bf
-    0,0,0,0,0,0,0,0,  # c0 - c7
-    0,0,0,0,0,0,0,0,  # c8 - cf
-    0,0,0,0,0,0,0,0,  # d0 - d7
-    0,0,0,0,0,0,0,0,  # d8 - df
-    0,0,0,0,0,0,0,0,  # e0 - e7
-    0,0,0,0,0,0,0,0,  # e8 - ef
-    0,0,0,0,0,0,0,0,  # f0 - f7
-    0,0,0,0,0,0,4,5   # f8 - ff
-)
-
-UCS2LE_ST = (
-          6,     6,     7,     6,     4,     3,MachineState.ERROR,MachineState.ERROR,#00-07
-     MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,#08-0f
-     MachineState.ITS_ME,MachineState.ITS_ME,     5,     5,     5,MachineState.ERROR,MachineState.ITS_ME,MachineState.ERROR,#10-17
-          5,     5,     5,MachineState.ERROR,     5,MachineState.ERROR,     6,     6,#18-1f
-          7,     6,     8,     8,     5,     5,     5,MachineState.ERROR,#20-27
-          5,     5,     5,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,     5,     5,#28-2f
-          5,     5,     5,MachineState.ERROR,     5,MachineState.ERROR,MachineState.START,MachineState.START #30-37
-)
-
-UCS2LE_CHAR_LEN_TABLE = (2, 2, 2, 2, 2, 2)
-
-UCS2LE_SM_MODEL = {'class_table': UCS2LE_CLS,
-                 'class_factor': 6,
-                 'state_table': UCS2LE_ST,
-                 'char_len_table': UCS2LE_CHAR_LEN_TABLE,
-                 'name': 'UTF-16LE'}
-
-# UTF-8
-
-UTF8_CLS = (
-    1,1,1,1,1,1,1,1,  # 00 - 07  #allow 0x00 as a legal value
-    1,1,1,1,1,1,0,0,  # 08 - 0f
-    1,1,1,1,1,1,1,1,  # 10 - 17
-    1,1,1,0,1,1,1,1,  # 18 - 1f
-    1,1,1,1,1,1,1,1,  # 20 - 27
-    1,1,1,1,1,1,1,1,  # 28 - 2f
-    1,1,1,1,1,1,1,1,  # 30 - 37
-    1,1,1,1,1,1,1,1,  # 38 - 3f
-    1,1,1,1,1,1,1,1,  # 40 - 47
-    1,1,1,1,1,1,1,1,  # 48 - 4f
-    1,1,1,1,1,1,1,1,  # 50 - 57
-    1,1,1,1,1,1,1,1,  # 58 - 5f
-    1,1,1,1,1,1,1,1,  # 60 - 67
-    1,1,1,1,1,1,1,1,  # 68 - 6f
-    1,1,1,1,1,1,1,1,  # 70 - 77
-    1,1,1,1,1,1,1,1,  # 78 - 7f
-    2,2,2,2,3,3,3,3,  # 80 - 87
-    4,4,4,4,4,4,4,4,  # 88 - 8f
-    4,4,4,4,4,4,4,4,  # 90 - 97
-    4,4,4,4,4,4,4,4,  # 98 - 9f
-    5,5,5,5,5,5,5,5,  # a0 - a7
-    5,5,5,5,5,5,5,5,  # a8 - af
-    5,5,5,5,5,5,5,5,  # b0 - b7
-    5,5,5,5,5,5,5,5,  # b8 - bf
-    0,0,6,6,6,6,6,6,  # c0 - c7
-    6,6,6,6,6,6,6,6,  # c8 - cf
-    6,6,6,6,6,6,6,6,  # d0 - d7
-    6,6,6,6,6,6,6,6,  # d8 - df
-    7,8,8,8,8,8,8,8,  # e0 - e7
-    8,8,8,8,8,9,8,8,  # e8 - ef
-    10,11,11,11,11,11,11,11,  # f0 - f7
-    12,13,13,13,14,15,0,0    # f8 - ff
-)
-
-UTF8_ST = (
-    MachineState.ERROR,MachineState.START,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,     12,   10,#00-07
-         9,     11,     8,     7,     6,     5,     4,    3,#08-0f
-    MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,#10-17
-    MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,#18-1f
-    MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,#20-27
-    MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,#28-2f
-    MachineState.ERROR,MachineState.ERROR,     5,     5,     5,     5,MachineState.ERROR,MachineState.ERROR,#30-37
-    MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,#38-3f
-    MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,     5,     5,     5,MachineState.ERROR,MachineState.ERROR,#40-47
-    MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,#48-4f
-    MachineState.ERROR,MachineState.ERROR,     7,     7,     7,     7,MachineState.ERROR,MachineState.ERROR,#50-57
-    MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,#58-5f
-    MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,     7,     7,MachineState.ERROR,MachineState.ERROR,#60-67
-    MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,#68-6f
-    MachineState.ERROR,MachineState.ERROR,     9,     9,     9,     9,MachineState.ERROR,MachineState.ERROR,#70-77
-    MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,#78-7f
-    MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,     9,MachineState.ERROR,MachineState.ERROR,#80-87
-    MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,#88-8f
-    MachineState.ERROR,MachineState.ERROR,    12,    12,    12,    12,MachineState.ERROR,MachineState.ERROR,#90-97
-    MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,#98-9f
-    MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,    12,MachineState.ERROR,MachineState.ERROR,#a0-a7
-    MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,#a8-af
-    MachineState.ERROR,MachineState.ERROR,    12,    12,    12,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,#b0-b7
-    MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,#b8-bf
-    MachineState.ERROR,MachineState.ERROR,MachineState.START,MachineState.START,MachineState.START,MachineState.START,MachineState.ERROR,MachineState.ERROR,#c0-c7
-    MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR #c8-cf
-)
-
-UTF8_CHAR_LEN_TABLE = (0, 1, 0, 0, 0, 0, 2, 3, 3, 3, 4, 4, 5, 5, 6, 6)
-
-UTF8_SM_MODEL = {'class_table': UTF8_CLS,
-                 'class_factor': 16,
-                 'state_table': UTF8_ST,
-                 'char_len_table': UTF8_CHAR_LEN_TABLE,
-                 'name': 'UTF-8'}
diff --git a/lib/sub_repos/chardet/chardet/metadata/__init__.py b/lib/sub_repos/chardet/chardet/metadata/__init__.py
deleted file mode 100644
index e69de29bb..000000000
diff --git a/lib/sub_repos/chardet/chardet/metadata/languages.py b/lib/sub_repos/chardet/chardet/metadata/languages.py
deleted file mode 100644
index 3237d5abf..000000000
--- a/lib/sub_repos/chardet/chardet/metadata/languages.py
+++ /dev/null
@@ -1,310 +0,0 @@
-#!/usr/bin/env python
-# -*- coding: utf-8 -*-
-"""
-Metadata about languages used by our model training code for our
-SingleByteCharSetProbers.  Could be used for other things in the future.
-
-This code is based on the language metadata from the uchardet project.
-"""
-from __future__ import absolute_import, print_function
-
-from string import ascii_letters
-
-
-# TODO: Add Ukranian (KOI8-U)
-
-class Language(object):
-    """Metadata about a language useful for training models
-
-    :ivar name: The human name for the language, in English.
-    :type name: str
-    :ivar iso_code: 2-letter ISO 639-1 if possible, 3-letter ISO code otherwise,
-                    or use another catalog as a last resort.
-    :type iso_code: str
-    :ivar use_ascii: Whether or not ASCII letters should be included in trained
-                     models.
-    :type use_ascii: bool
-    :ivar charsets: The charsets we want to support and create data for.
-    :type charsets: list of str
-    :ivar alphabet: The characters in the language's alphabet. If `use_ascii` is
-                    `True`, you only need to add those not in the ASCII set.
-    :type alphabet: str
-    :ivar wiki_start_pages: The Wikipedia pages to start from if we're crawling
-                            Wikipedia for training data.
-    :type wiki_start_pages: list of str
-    """
-    def __init__(self, name=None, iso_code=None, use_ascii=True, charsets=None,
-                 alphabet=None, wiki_start_pages=None):
-        super(Language, self).__init__()
-        self.name = name
-        self.iso_code = iso_code
-        self.use_ascii = use_ascii
-        self.charsets = charsets
-        if self.use_ascii:
-            if alphabet:
-                alphabet += ascii_letters
-            else:
-                alphabet = ascii_letters
-        elif not alphabet:
-            raise ValueError('Must supply alphabet if use_ascii is False')
-        self.alphabet = ''.join(sorted(set(alphabet))) if alphabet else None
-        self.wiki_start_pages = wiki_start_pages
-
-    def __repr__(self):
-        return '{}({})'.format(self.__class__.__name__,
-                               ', '.join('{}={!r}'.format(k, v)
-                                         for k, v in self.__dict__.items()
-                                         if not k.startswith('_')))
-
-
-LANGUAGES = {'Arabic': Language(name='Arabic',
-                                iso_code='ar',
-                                use_ascii=False,
-                                # We only support encodings that use isolated
-                                # forms, because the current recommendation is
-                                # that the rendering system handles presentation
-                                # forms. This means we purposefully skip IBM864.
-                                charsets=['ISO-8859-6', 'WINDOWS-1256',
-                                          'CP720', 'CP864'],
-                                alphabet=u'ءآأؤإئابةتثجحخدذرزسشصضطظعغػؼؽؾؿـÙقكلمنهوىيًٌÙÙŽÙÙÙ‘',
-                                wiki_start_pages=[u'Ø§Ù„ØµÙØ­Ø©_الرئيسية']),
-             'Belarusian': Language(name='Belarusian',
-                                    iso_code='be',
-                                    use_ascii=False,
-                                    charsets=['ISO-8859-5', 'WINDOWS-1251',
-                                              'IBM866', 'MacCyrillic'],
-                                    alphabet=(u'ÐБВГДЕÐЖЗІЙКЛМÐОПРСТУЎФХЦЧШЫЬЭЮЯ'
-                                              u'абвгдеёжзійклмнопрÑтуўфхцчшыьÑÑŽÑʼ'),
-                                    wiki_start_pages=[u'ГалоўнаÑ_Ñтаронка']),
-             'Bulgarian': Language(name='Bulgarian',
-                                   iso_code='bg',
-                                   use_ascii=False,
-                                   charsets=['ISO-8859-5', 'WINDOWS-1251',
-                                             'IBM855'],
-                                   alphabet=(u'ÐБВГДЕЖЗИЙКЛМÐОПРСТУФХЦЧШЩЪЬЮЯ'
-                                             u'абвгдежзийклмнопрÑтуфхцчшщъьюÑ'),
-                                   wiki_start_pages=[u'Ðачална_Ñтраница']),
-             'Czech': Language(name='Czech',
-                               iso_code='cz',
-                               use_ascii=True,
-                               charsets=['ISO-8859-2', 'WINDOWS-1250'],
-                               alphabet=u'áÄÄéěíňóřšťúůýžÃČĎÉĚÃŇÓŘŠŤÚŮÃŽ',
-                               wiki_start_pages=[u'Hlavní_strana']),
-             'Danish': Language(name='Danish',
-                                iso_code='da',
-                                use_ascii=True,
-                                charsets=['ISO-8859-1', 'ISO-8859-15',
-                                          'WINDOWS-1252'],
-                                alphabet=u'æøåÆØÅ',
-                                wiki_start_pages=[u'Forside']),
-             'German': Language(name='German',
-                                iso_code='de',
-                                use_ascii=True,
-                                charsets=['ISO-8859-1', 'WINDOWS-1252'],
-                                alphabet=u'äöüßÄÖÜ',
-                                wiki_start_pages=[u'Wikipedia:Hauptseite']),
-             'Greek': Language(name='Greek',
-                               iso_code='el',
-                               use_ascii=False,
-                               charsets=['ISO-8859-7', 'WINDOWS-1253'],
-                               alphabet=(u'αβγδεζηθικλμνξοπÏσςτυφχψωάέήίόÏÏŽ'
-                                         u'ΑΒΓΔΕΖΗΘΙΚΛΜÎΞΟΠΡΣΣΤΥΦΧΨΩΆΈΉΊΌΎÎ'),
-                               wiki_start_pages=[u'ΠÏλη:ΚÏÏια']),
-             'English': Language(name='English',
-                                 iso_code='en',
-                                 use_ascii=True,
-                                 charsets=['ISO-8859-1', 'WINDOWS-1252'],
-                                 wiki_start_pages=[u'Main_Page']),
-             'Esperanto': Language(name='Esperanto',
-                                   iso_code='eo',
-                                   # Q, W, X, and Y not used at all
-                                   use_ascii=False,
-                                   charsets=['ISO-8859-3'],
-                                   alphabet=(u'abcĉdefgÄhÄ¥ijĵklmnoprsÅtuÅ­vz'
-                                             u'ABCĈDEFGĜHĤIJĴKLMNOPRSŜTUŬVZ'),
-                                   wiki_start_pages=[u'Vikipedio:ĈefpaÄo']),
-             'Spanish': Language(name='Spanish',
-                                 iso_code='es',
-                                 use_ascii=True,
-                                 charsets=['ISO-8859-1', 'ISO-8859-15',
-                                           'WINDOWS-1252'],
-                                 alphabet=u'ñáéíóúüÑÃÉÃÓÚÜ',
-                                 wiki_start_pages=[u'Wikipedia:Portada']),
-             'Estonian': Language(name='Estonian',
-                                  iso_code='et',
-                                  use_ascii=False,
-                                  charsets=['ISO-8859-4', 'ISO-8859-13',
-                                            'WINDOWS-1257'],
-                                  # C, F, Š, Q, W, X, Y, Z, Ž are only for
-                                  # loanwords
-                                  alphabet=(u'ABDEGHIJKLMNOPRSTUVÕÄÖÜ'
-                                            u'abdeghijklmnoprstuvõäöü'),
-                                  wiki_start_pages=[u'Esileht']),
-             'Finnish': Language(name='Finnish',
-                                 iso_code='fi',
-                                 use_ascii=True,
-                                 charsets=['ISO-8859-1', 'ISO-8859-15',
-                                           'WINDOWS-1252'],
-                                 alphabet=u'ÅÄÖŠŽåäöšž',
-                                 wiki_start_pages=[u'Wikipedia:Etusivu']),
-             'French': Language(name='French',
-                                iso_code='fr',
-                                use_ascii=True,
-                                charsets=['ISO-8859-1', 'ISO-8859-15',
-                                          'WINDOWS-1252'],
-                                alphabet=u'œàâçèéîïùûêŒÀÂÇÈÉÎÃÙÛÊ',
-                                wiki_start_pages=[u'Wikipédia:Accueil_principal',
-                                                  u'Bœuf (animal)']),
-             'Hebrew': Language(name='Hebrew',
-                                iso_code='he',
-                                use_ascii=False,
-                                charsets=['ISO-8859-8', 'WINDOWS-1255'],
-                                alphabet=u'×בגדהוזחטיךכל×מןנסעףפץצקרשתװױײ',
-                                wiki_start_pages=[u'עמוד_ר×שי']),
-             'Croatian': Language(name='Croatian',
-                                  iso_code='hr',
-                                  # Q, W, X, Y are only used for foreign words.
-                                  use_ascii=False,
-                                  charsets=['ISO-8859-2', 'WINDOWS-1250'],
-                                  alphabet=(u'abcÄćdÄ‘efghijklmnoprsÅ¡tuvzž'
-                                            u'ABCČĆDÄEFGHIJKLMNOPRSÅ TUVZŽ'),
-                                  wiki_start_pages=[u'Glavna_stranica']),
-             'Hungarian': Language(name='Hungarian',
-                                   iso_code='hu',
-                                   # Q, W, X, Y are only used for foreign words.
-                                   use_ascii=False,
-                                   charsets=['ISO-8859-2', 'WINDOWS-1250'],
-                                   alphabet=(u'abcdefghijklmnoprstuvzáéíóöőúüű'
-                                             u'ABCDEFGHIJKLMNOPRSTUVZÃÉÃÓÖÅÚÜŰ'),
-                                   wiki_start_pages=[u'Kezdőlap']),
-             'Italian': Language(name='Italian',
-                                 iso_code='it',
-                                 use_ascii=True,
-                                 charsets=['ISO-8859-1', 'ISO-8859-15',
-                                           'WINDOWS-1252'],
-                                 alphabet=u'ÀÈÉÌÒÓÙàèéìòóù',
-                                 wiki_start_pages=[u'Pagina_principale']),
-             'Lithuanian': Language(name='Lithuanian',
-                                    iso_code='lt',
-                                    use_ascii=False,
-                                    charsets=['ISO-8859-13', 'WINDOWS-1257',
-                                              'ISO-8859-4'],
-                                    # Q, W, and X not used at all
-                                    alphabet=(u'AĄBCČDEĘĖFGHIĮYJKLMNOPRSŠTUŲŪVZŽ'
-                                              u'aÄ…bcÄdeęėfghiįyjklmnoprsÅ¡tuųūvzž'),
-                                    wiki_start_pages=[u'Pagrindinis_puslapis']),
-             'Latvian': Language(name='Latvian',
-                                 iso_code='lv',
-                                 use_ascii=False,
-                                 charsets=['ISO-8859-13', 'WINDOWS-1257',
-                                           'ISO-8859-4'],
-                                 # Q, W, X, Y are only for loanwords
-                                 alphabet=(u'AĀBCČDEĒFGĢHIĪJKĶLĻMNŅOPRSŠTUŪVZŽ'
-                                           u'aÄbcÄdeÄ“fgÄ£hiÄ«jkÄ·lļmnņoprsÅ¡tuÅ«vzž'),
-                                 wiki_start_pages=[u'SÄkumlapa']),
-             'Macedonian': Language(name='Macedonian',
-                                    iso_code='mk',
-                                    use_ascii=False,
-                                    charsets=['ISO-8859-5', 'WINDOWS-1251',
-                                              'MacCyrillic', 'IBM855'],
-                                    alphabet=(u'ÐБВГДЃЕЖЗЅИЈКЛЉМÐЊОПРСТЌУФХЦЧÐШ'
-                                              u'абвгдѓежзѕијклљмнњопрÑтќуфхцчџш'),
-                                    wiki_start_pages=[u'Главна_Ñтраница']),
-             'Dutch': Language(name='Dutch',
-                               iso_code='nl',
-                               use_ascii=True,
-                               charsets=['ISO-8859-1', 'WINDOWS-1252'],
-                               wiki_start_pages=[u'Hoofdpagina']),
-             'Polish': Language(name='Polish',
-                                iso_code='pl',
-                                # Q and X are only used for foreign words.
-                                use_ascii=False,
-                                charsets=['ISO-8859-2', 'WINDOWS-1250'],
-                                alphabet=(u'AÄ„BCĆDEĘFGHIJKLÅMNŃOÓPRSÅšTUWYZŹŻ'
-                                          u'aąbcćdeęfghijklłmnńoóprsśtuwyzźż'),
-                                wiki_start_pages=[u'Wikipedia:Strona_główna']),
-             'Portuguese': Language(name='Portuguese',
-                                 iso_code='pt',
-                                 use_ascii=True,
-                                 charsets=['ISO-8859-1', 'ISO-8859-15',
-                                           'WINDOWS-1252'],
-                                 alphabet=u'ÃÂÃÀÇÉÊÃÓÔÕÚáâãàçéêíóôõú',
-                                 wiki_start_pages=[u'Wikipédia:Página_principal']),
-             'Romanian': Language(name='Romanian',
-                                  iso_code='ro',
-                                  use_ascii=True,
-                                  charsets=['ISO-8859-2', 'WINDOWS-1250'],
-                                  alphabet=u'ăâîșțĂÂÎȘȚ',
-                                  wiki_start_pages=[u'Pagina_principală']),
-             'Russian': Language(name='Russian',
-                                 iso_code='ru',
-                                 use_ascii=False,
-                                 charsets=['ISO-8859-5', 'WINDOWS-1251',
-                                           'KOI8-R', 'MacCyrillic', 'IBM866',
-                                           'IBM855'],
-                                 alphabet=(u'абвгдеёжзийклмнопрÑтуфхцчшщъыьÑÑŽÑ'
-                                           u'ÐБВГДЕÐЖЗИЙКЛМÐОПРСТУФХЦЧШЩЪЫЬЭЮЯ'),
-                                 wiki_start_pages=[u'ЗаглавнаÑ_Ñтраница']),
-             'Slovak': Language(name='Slovak',
-                                iso_code='sk',
-                                use_ascii=True,
-                                charsets=['ISO-8859-2', 'WINDOWS-1250'],
-                                alphabet=u'áäÄÄéíĺľňóôŕšťúýžÃÄČĎÉÃĹĽŇÓÔŔŠŤÚÃŽ',
-                                wiki_start_pages=[u'Hlavná_stránka']),
-             'Slovene': Language(name='Slovene',
-                                 iso_code='sl',
-                                 # Q, W, X, Y are only used for foreign words.
-                                 use_ascii=False,
-                                 charsets=['ISO-8859-2', 'WINDOWS-1250'],
-                                 alphabet=(u'abcÄdefghijklmnoprsÅ¡tuvzž'
-                                           u'ABCČDEFGHIJKLMNOPRSŠTUVZŽ'),
-                                 wiki_start_pages=[u'Glavna_stran']),
-             # Serbian can be written in both Latin and Cyrillic, but there's no
-             # simple way to get the Latin alphabet pages from Wikipedia through
-             # the API, so for now we just support Cyrillic.
-             'Serbian': Language(name='Serbian',
-                                 iso_code='sr',
-                                 alphabet=(u'ÐБВГДЂЕЖЗИЈКЛЉМÐЊОПРСТЋУФХЦЧÐШ'
-                                           u'абвгдђежзијклљмнњопрÑтћуфхцчџш'),
-                                 charsets=['ISO-8859-5', 'WINDOWS-1251',
-                                           'MacCyrillic', 'IBM855'],
-                                 wiki_start_pages=[u'Главна_Ñтрана']),
-             'Thai': Language(name='Thai',
-                              iso_code='th',
-                              use_ascii=False,
-                              charsets=['ISO-8859-11', 'TIS-620', 'CP874'],
-                              alphabet=u'à¸à¸‚ฃคฅฆงจฉชซฌà¸à¸Žà¸à¸à¸‘ฒณดตถทธนบปผà¸à¸žà¸Ÿà¸ à¸¡à¸¢à¸£à¸¤à¸¥à¸¦à¸§à¸¨à¸©à¸ªà¸«à¸¬à¸­à¸®à¸¯à¸°à¸±à¸²à¸³à¸´à¸µà¸¶à¸·à¸ºà¸¸à¸¹à¸¿à¹€à¹à¹‚ใไๅๆ็่้๊๋์à¹à¹Žà¹à¹à¹‘๒๓๔๕๖๗๘๙๚๛',
-                              wiki_start_pages=[u'หน้าหลัà¸']),
-             'Turkish': Language(name='Turkish',
-                                 iso_code='tr',
-                                 # Q, W, and X are not used by Turkish
-                                 use_ascii=False,
-                                 charsets=['ISO-8859-3', 'ISO-8859-9',
-                                           'WINDOWS-1254'],
-                                 alphabet=(u'abcçdefgğhıijklmnoöprsştuüvyzâîû'
-                                           u'ABCÇDEFGĞHIİJKLMNOÖPRSŞTUÜVYZÂÎÛ'),
-                                 wiki_start_pages=[u'Ana_Sayfa']),
-             'Vietnamese': Language(name='Vietnamese',
-                                    iso_code='vi',
-                                    use_ascii=False,
-                                    # Windows-1258 is the only common 8-bit
-                                    # Vietnamese encoding supported by Python.
-                                    # From Wikipedia:
-                                    # For systems that lack support for Unicode,
-                                    # dozens of 8-bit Vietnamese code pages are
-                                    # available.[1] The most common are VISCII
-                                    # (TCVN 5712:1993), VPS, and Windows-1258.[3]
-                                    # Where ASCII is required, such as when
-                                    # ensuring readability in plain text e-mail,
-                                    # Vietnamese letters are often encoded
-                                    # according to Vietnamese Quoted-Readable
-                                    # (VIQR) or VSCII Mnemonic (VSCII-MNEM),[4]
-                                    # though usage of either variable-width
-                                    # scheme has declined dramatically following
-                                    # the adoption of Unicode on the World Wide
-                                    # Web.
-                                    charsets=['WINDOWS-1258'],
-                                    alphabet=(u'aăâbcdđeêghiklmnoôơpqrstuưvxy'
-                                              u'AĂÂBCDÄEÊGHIKLMNOÔƠPQRSTUƯVXY'),
-                                    wiki_start_pages=[u'Chữ_Quốc_ngữ']),
-            }
diff --git a/lib/sub_repos/chardet/chardet/sbcharsetprober.py b/lib/sub_repos/chardet/chardet/sbcharsetprober.py
deleted file mode 100644
index 46ba835c6..000000000
--- a/lib/sub_repos/chardet/chardet/sbcharsetprober.py
+++ /dev/null
@@ -1,145 +0,0 @@
-######################## BEGIN LICENSE BLOCK ########################
-# The Original Code is Mozilla Universal charset detector code.
-#
-# The Initial Developer of the Original Code is
-# Netscape Communications Corporation.
-# Portions created by the Initial Developer are Copyright (C) 2001
-# the Initial Developer. All Rights Reserved.
-#
-# Contributor(s):
-#   Mark Pilgrim - port to Python
-#   Shy Shalom - original C code
-#
-# This library is free software; you can redistribute it and/or
-# modify it under the terms of the GNU Lesser General Public
-# License as published by the Free Software Foundation; either
-# version 2.1 of the License, or (at your option) any later version.
-#
-# This library is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-# Lesser General Public License for more details.
-#
-# You should have received a copy of the GNU Lesser General Public
-# License along with this library; if not, write to the Free Software
-# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
-# 02110-1301  USA
-######################### END LICENSE BLOCK #########################
-
-from collections import namedtuple
-
-from .charsetprober import CharSetProber
-from .enums import CharacterCategory, ProbingState, SequenceLikelihood
-
-
-SingleByteCharSetModel = namedtuple('SingleByteCharSetModel',
-                                    ['charset_name',
-                                     'language',
-                                     'char_to_order_map',
-                                     'language_model',
-                                     'typical_positive_ratio',
-                                     'keep_ascii_letters',
-                                     'alphabet'])
-
-
-class SingleByteCharSetProber(CharSetProber):
-    SAMPLE_SIZE = 64
-    SB_ENOUGH_REL_THRESHOLD = 1024  #  0.25 * SAMPLE_SIZE^2
-    POSITIVE_SHORTCUT_THRESHOLD = 0.95
-    NEGATIVE_SHORTCUT_THRESHOLD = 0.05
-
-    def __init__(self, model, reversed=False, name_prober=None):
-        super(SingleByteCharSetProber, self).__init__()
-        self._model = model
-        # TRUE if we need to reverse every pair in the model lookup
-        self._reversed = reversed
-        # Optional auxiliary prober for name decision
-        self._name_prober = name_prober
-        self._last_order = None
-        self._seq_counters = None
-        self._total_seqs = None
-        self._total_char = None
-        self._freq_char = None
-        self.reset()
-
-    def reset(self):
-        super(SingleByteCharSetProber, self).reset()
-        # char order of last character
-        self._last_order = 255
-        self._seq_counters = [0] * SequenceLikelihood.get_num_categories()
-        self._total_seqs = 0
-        self._total_char = 0
-        # characters that fall in our sampling range
-        self._freq_char = 0
-
-    @property
-    def charset_name(self):
-        if self._name_prober:
-            return self._name_prober.charset_name
-        else:
-            return self._model.charset_name
-
-    @property
-    def language(self):
-        if self._name_prober:
-            return self._name_prober.language
-        else:
-            return self._model.language
-
-    def feed(self, byte_str):
-        # TODO: Make filter_international_words keep things in self.alphabet
-        if not self._model.keep_ascii_letters:
-            byte_str = self.filter_international_words(byte_str)
-        if not byte_str:
-            return self.state
-        char_to_order_map = self._model.char_to_order_map
-        language_model = self._model.language_model
-        for char in byte_str:
-            order = char_to_order_map.get(char, CharacterCategory.UNDEFINED)
-            # XXX: This was SYMBOL_CAT_ORDER before, with a value of 250, but
-            #      CharacterCategory.SYMBOL is actually 253, so we use CONTROL
-            #      to make it closer to the original intent. The only difference
-            #      is whether or not we count digits and control characters for
-            #      _total_char purposes.
-            if order < CharacterCategory.CONTROL:
-                self._total_char += 1
-            # TODO: Follow uchardet's lead and discount confidence for frequent
-            #       control characters.
-            #       See https://github.com/BYVoid/uchardet/commit/55b4f23971db61
-            if order < self.SAMPLE_SIZE:
-                self._freq_char += 1
-                if self._last_order < self.SAMPLE_SIZE:
-                    self._total_seqs += 1
-                    if not self._reversed:
-                        lm_cat = language_model[self._last_order][order]
-                    else:
-                        lm_cat = language_model[order][self._last_order]
-                    self._seq_counters[lm_cat] += 1
-            self._last_order = order
-
-        charset_name = self._model.charset_name
-        if self.state == ProbingState.DETECTING:
-            if self._total_seqs > self.SB_ENOUGH_REL_THRESHOLD:
-                confidence = self.get_confidence()
-                if confidence > self.POSITIVE_SHORTCUT_THRESHOLD:
-                    self.logger.debug('%s confidence = %s, we have a winner',
-                                      charset_name, confidence)
-                    self._state = ProbingState.FOUND_IT
-                elif confidence < self.NEGATIVE_SHORTCUT_THRESHOLD:
-                    self.logger.debug('%s confidence = %s, below negative '
-                                      'shortcut threshhold %s', charset_name,
-                                      confidence,
-                                      self.NEGATIVE_SHORTCUT_THRESHOLD)
-                    self._state = ProbingState.NOT_ME
-
-        return self.state
-
-    def get_confidence(self):
-        r = 0.01
-        if self._total_seqs > 0:
-            r = ((1.0 * self._seq_counters[SequenceLikelihood.POSITIVE]) /
-                 self._total_seqs / self._model.typical_positive_ratio)
-            r = r * self._freq_char / self._total_char
-            if r >= 1.0:
-                r = 0.99
-        return r
diff --git a/lib/sub_repos/chardet/chardet/sbcsgroupprober.py b/lib/sub_repos/chardet/chardet/sbcsgroupprober.py
deleted file mode 100644
index bdeef4e15..000000000
--- a/lib/sub_repos/chardet/chardet/sbcsgroupprober.py
+++ /dev/null
@@ -1,83 +0,0 @@
-######################## BEGIN LICENSE BLOCK ########################
-# The Original Code is Mozilla Universal charset detector code.
-#
-# The Initial Developer of the Original Code is
-# Netscape Communications Corporation.
-# Portions created by the Initial Developer are Copyright (C) 2001
-# the Initial Developer. All Rights Reserved.
-#
-# Contributor(s):
-#   Mark Pilgrim - port to Python
-#   Shy Shalom - original C code
-#
-# This library is free software; you can redistribute it and/or
-# modify it under the terms of the GNU Lesser General Public
-# License as published by the Free Software Foundation; either
-# version 2.1 of the License, or (at your option) any later version.
-#
-# This library is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-# Lesser General Public License for more details.
-#
-# You should have received a copy of the GNU Lesser General Public
-# License along with this library; if not, write to the Free Software
-# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
-# 02110-1301  USA
-######################### END LICENSE BLOCK #########################
-
-from .charsetgroupprober import CharSetGroupProber
-from .hebrewprober import HebrewProber
-from .langbulgarianmodel import (ISO_8859_5_BULGARIAN_MODEL,
-                                 WINDOWS_1251_BULGARIAN_MODEL)
-from .langgreekmodel import ISO_8859_7_GREEK_MODEL, WINDOWS_1253_GREEK_MODEL
-from .langhebrewmodel import WINDOWS_1255_HEBREW_MODEL
-# from .langhungarianmodel import (ISO_8859_2_HUNGARIAN_MODEL,
-#                                  WINDOWS_1250_HUNGARIAN_MODEL)
-from .langrussianmodel import (IBM855_RUSSIAN_MODEL, IBM866_RUSSIAN_MODEL,
-                               ISO_8859_5_RUSSIAN_MODEL, KOI8_R_RUSSIAN_MODEL,
-                               MACCYRILLIC_RUSSIAN_MODEL,
-                               WINDOWS_1251_RUSSIAN_MODEL)
-from .langthaimodel import TIS_620_THAI_MODEL
-from .langturkishmodel import ISO_8859_9_TURKISH_MODEL
-from .sbcharsetprober import SingleByteCharSetProber
-
-
-class SBCSGroupProber(CharSetGroupProber):
-    def __init__(self):
-        super(SBCSGroupProber, self).__init__()
-        hebrew_prober = HebrewProber()
-        logical_hebrew_prober = SingleByteCharSetProber(WINDOWS_1255_HEBREW_MODEL,
-                                                        False, hebrew_prober)
-        # TODO: See if using ISO-8859-8 Hebrew model works better here, since
-        #       it's actually the visual one
-        visual_hebrew_prober = SingleByteCharSetProber(WINDOWS_1255_HEBREW_MODEL,
-                                                       True, hebrew_prober)
-        hebrew_prober.set_model_probers(logical_hebrew_prober,
-                                        visual_hebrew_prober)
-        # TODO: ORDER MATTERS HERE. I changed the order vs what was in master
-        #       and several tests failed that did not before. Some thought
-        #       should be put into the ordering, and we should consider making
-        #       order not matter here, because that is very counter-intuitive.
-        self.probers = [
-            SingleByteCharSetProber(WINDOWS_1251_RUSSIAN_MODEL),
-            SingleByteCharSetProber(KOI8_R_RUSSIAN_MODEL),
-            SingleByteCharSetProber(ISO_8859_5_RUSSIAN_MODEL),
-            SingleByteCharSetProber(MACCYRILLIC_RUSSIAN_MODEL),
-            SingleByteCharSetProber(IBM866_RUSSIAN_MODEL),
-            SingleByteCharSetProber(IBM855_RUSSIAN_MODEL),
-            SingleByteCharSetProber(ISO_8859_7_GREEK_MODEL),
-            SingleByteCharSetProber(WINDOWS_1253_GREEK_MODEL),
-            SingleByteCharSetProber(ISO_8859_5_BULGARIAN_MODEL),
-            SingleByteCharSetProber(WINDOWS_1251_BULGARIAN_MODEL),
-            # TODO: Restore Hungarian encodings (iso-8859-2 and windows-1250)
-            #       after we retrain model.
-            # SingleByteCharSetProber(ISO_8859_2_HUNGARIAN_MODEL),
-            # SingleByteCharSetProber(WINDOWS_1250_HUNGARIAN_MODEL),
-            SingleByteCharSetProber(TIS_620_THAI_MODEL),
-            SingleByteCharSetProber(ISO_8859_9_TURKISH_MODEL),
-            hebrew_prober,
-            logical_hebrew_prober,
-            visual_hebrew_prober,
-        ]
-        self.reset()
diff --git a/lib/sub_repos/chardet/chardet/sjisprober.py b/lib/sub_repos/chardet/chardet/sjisprober.py
deleted file mode 100644
index 9e29623bd..000000000
--- a/lib/sub_repos/chardet/chardet/sjisprober.py
+++ /dev/null
@@ -1,92 +0,0 @@
-######################## BEGIN LICENSE BLOCK ########################
-# The Original Code is mozilla.org code.
-#
-# The Initial Developer of the Original Code is
-# Netscape Communications Corporation.
-# Portions created by the Initial Developer are Copyright (C) 1998
-# the Initial Developer. All Rights Reserved.
-#
-# Contributor(s):
-#   Mark Pilgrim - port to Python
-#
-# This library is free software; you can redistribute it and/or
-# modify it under the terms of the GNU Lesser General Public
-# License as published by the Free Software Foundation; either
-# version 2.1 of the License, or (at your option) any later version.
-#
-# This library is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-# Lesser General Public License for more details.
-#
-# You should have received a copy of the GNU Lesser General Public
-# License along with this library; if not, write to the Free Software
-# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
-# 02110-1301  USA
-######################### END LICENSE BLOCK #########################
-
-from .mbcharsetprober import MultiByteCharSetProber
-from .codingstatemachine import CodingStateMachine
-from .chardistribution import SJISDistributionAnalysis
-from .jpcntx import SJISContextAnalysis
-from .mbcssm import SJIS_SM_MODEL
-from .enums import ProbingState, MachineState
-
-
-class SJISProber(MultiByteCharSetProber):
-    def __init__(self):
-        super(SJISProber, self).__init__()
-        self.coding_sm = CodingStateMachine(SJIS_SM_MODEL)
-        self.distribution_analyzer = SJISDistributionAnalysis()
-        self.context_analyzer = SJISContextAnalysis()
-        self.reset()
-
-    def reset(self):
-        super(SJISProber, self).reset()
-        self.context_analyzer.reset()
-
-    @property
-    def charset_name(self):
-        return self.context_analyzer.charset_name
-
-    @property
-    def language(self):
-        return "Japanese"
-
-    def feed(self, byte_str):
-        for i in range(len(byte_str)):
-            coding_state = self.coding_sm.next_state(byte_str[i])
-            if coding_state == MachineState.ERROR:
-                self.logger.debug('%s %s prober hit error at byte %s',
-                                  self.charset_name, self.language, i)
-                self._state = ProbingState.NOT_ME
-                break
-            elif coding_state == MachineState.ITS_ME:
-                self._state = ProbingState.FOUND_IT
-                break
-            elif coding_state == MachineState.START:
-                char_len = self.coding_sm.get_current_charlen()
-                if i == 0:
-                    self._last_char[1] = byte_str[0]
-                    self.context_analyzer.feed(self._last_char[2 - char_len:],
-                                               char_len)
-                    self.distribution_analyzer.feed(self._last_char, char_len)
-                else:
-                    self.context_analyzer.feed(byte_str[i + 1 - char_len:i + 3
-                                                        - char_len], char_len)
-                    self.distribution_analyzer.feed(byte_str[i - 1:i + 1],
-                                                    char_len)
-
-        self._last_char[0] = byte_str[-1]
-
-        if self.state == ProbingState.DETECTING:
-            if (self.context_analyzer.got_enough_data() and
-               (self.get_confidence() > self.SHORTCUT_THRESHOLD)):
-                self._state = ProbingState.FOUND_IT
-
-        return self.state
-
-    def get_confidence(self):
-        context_conf = self.context_analyzer.get_confidence()
-        distrib_conf = self.distribution_analyzer.get_confidence()
-        return max(context_conf, distrib_conf)
diff --git a/lib/sub_repos/chardet/chardet/universaldetector.py b/lib/sub_repos/chardet/chardet/universaldetector.py
deleted file mode 100644
index 055a8ac1b..000000000
--- a/lib/sub_repos/chardet/chardet/universaldetector.py
+++ /dev/null
@@ -1,286 +0,0 @@
-######################## BEGIN LICENSE BLOCK ########################
-# The Original Code is Mozilla Universal charset detector code.
-#
-# The Initial Developer of the Original Code is
-# Netscape Communications Corporation.
-# Portions created by the Initial Developer are Copyright (C) 2001
-# the Initial Developer. All Rights Reserved.
-#
-# Contributor(s):
-#   Mark Pilgrim - port to Python
-#   Shy Shalom - original C code
-#
-# This library is free software; you can redistribute it and/or
-# modify it under the terms of the GNU Lesser General Public
-# License as published by the Free Software Foundation; either
-# version 2.1 of the License, or (at your option) any later version.
-#
-# This library is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-# Lesser General Public License for more details.
-#
-# You should have received a copy of the GNU Lesser General Public
-# License along with this library; if not, write to the Free Software
-# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
-# 02110-1301  USA
-######################### END LICENSE BLOCK #########################
-"""
-Module containing the UniversalDetector detector class, which is the primary
-class a user of ``chardet`` should use.
-
-:author: Mark Pilgrim (initial port to Python)
-:author: Shy Shalom (original C code)
-:author: Dan Blanchard (major refactoring for 3.0)
-:author: Ian Cordasco
-"""
-
-
-import codecs
-import logging
-import re
-
-from .charsetgroupprober import CharSetGroupProber
-from .enums import InputState, LanguageFilter, ProbingState
-from .escprober import EscCharSetProber
-from .latin1prober import Latin1Prober
-from .mbcsgroupprober import MBCSGroupProber
-from .sbcsgroupprober import SBCSGroupProber
-
-
-class UniversalDetector(object):
-    """
-    The ``UniversalDetector`` class underlies the ``chardet.detect`` function
-    and coordinates all of the different charset probers.
-
-    To get a ``dict`` containing an encoding and its confidence, you can simply
-    run:
-
-    .. code::
-
-            u = UniversalDetector()
-            u.feed(some_bytes)
-            u.close()
-            detected = u.result
-
-    """
-
-    MINIMUM_THRESHOLD = 0.20
-    HIGH_BYTE_DETECTOR = re.compile(b'[\x80-\xFF]')
-    ESC_DETECTOR = re.compile(b'(\033|~{)')
-    WIN_BYTE_DETECTOR = re.compile(b'[\x80-\x9F]')
-    ISO_WIN_MAP = {'iso-8859-1': 'Windows-1252',
-                   'iso-8859-2': 'Windows-1250',
-                   'iso-8859-5': 'Windows-1251',
-                   'iso-8859-6': 'Windows-1256',
-                   'iso-8859-7': 'Windows-1253',
-                   'iso-8859-8': 'Windows-1255',
-                   'iso-8859-9': 'Windows-1254',
-                   'iso-8859-13': 'Windows-1257'}
-
-    def __init__(self, lang_filter=LanguageFilter.ALL):
-        self._esc_charset_prober = None
-        self._charset_probers = []
-        self.result = None
-        self.done = None
-        self._got_data = None
-        self._input_state = None
-        self._last_char = None
-        self.lang_filter = lang_filter
-        self.logger = logging.getLogger(__name__)
-        self._has_win_bytes = None
-        self.reset()
-
-    def reset(self):
-        """
-        Reset the UniversalDetector and all of its probers back to their
-        initial states.  This is called by ``__init__``, so you only need to
-        call this directly in between analyses of different documents.
-        """
-        self.result = {'encoding': None, 'confidence': 0.0, 'language': None}
-        self.done = False
-        self._got_data = False
-        self._has_win_bytes = False
-        self._input_state = InputState.PURE_ASCII
-        self._last_char = b''
-        if self._esc_charset_prober:
-            self._esc_charset_prober.reset()
-        for prober in self._charset_probers:
-            prober.reset()
-
-    def feed(self, byte_str):
-        """
-        Takes a chunk of a document and feeds it through all of the relevant
-        charset probers.
-
-        After calling ``feed``, you can check the value of the ``done``
-        attribute to see if you need to continue feeding the
-        ``UniversalDetector`` more data, or if it has made a prediction
-        (in the ``result`` attribute).
-
-        .. note::
-           You should always call ``close`` when you're done feeding in your
-           document if ``done`` is not already ``True``.
-        """
-        if self.done:
-            return
-
-        if not len(byte_str):
-            return
-
-        if not isinstance(byte_str, bytearray):
-            byte_str = bytearray(byte_str)
-
-        # First check for known BOMs, since these are guaranteed to be correct
-        if not self._got_data:
-            # If the data starts with BOM, we know it is UTF
-            if byte_str.startswith(codecs.BOM_UTF8):
-                # EF BB BF  UTF-8 with BOM
-                self.result = {'encoding': "UTF-8-SIG",
-                               'confidence': 1.0,
-                               'language': ''}
-            elif byte_str.startswith((codecs.BOM_UTF32_LE,
-                                      codecs.BOM_UTF32_BE)):
-                # FF FE 00 00  UTF-32, little-endian BOM
-                # 00 00 FE FF  UTF-32, big-endian BOM
-                self.result = {'encoding': "UTF-32",
-                               'confidence': 1.0,
-                               'language': ''}
-            elif byte_str.startswith(b'\xFE\xFF\x00\x00'):
-                # FE FF 00 00  UCS-4, unusual octet order BOM (3412)
-                self.result = {'encoding': "X-ISO-10646-UCS-4-3412",
-                               'confidence': 1.0,
-                               'language': ''}
-            elif byte_str.startswith(b'\x00\x00\xFF\xFE'):
-                # 00 00 FF FE  UCS-4, unusual octet order BOM (2143)
-                self.result = {'encoding': "X-ISO-10646-UCS-4-2143",
-                               'confidence': 1.0,
-                               'language': ''}
-            elif byte_str.startswith((codecs.BOM_LE, codecs.BOM_BE)):
-                # FF FE  UTF-16, little endian BOM
-                # FE FF  UTF-16, big endian BOM
-                self.result = {'encoding': "UTF-16",
-                               'confidence': 1.0,
-                               'language': ''}
-
-            self._got_data = True
-            if self.result['encoding'] is not None:
-                self.done = True
-                return
-
-        # If none of those matched and we've only see ASCII so far, check
-        # for high bytes and escape sequences
-        if self._input_state == InputState.PURE_ASCII:
-            if self.HIGH_BYTE_DETECTOR.search(byte_str):
-                self._input_state = InputState.HIGH_BYTE
-            elif self._input_state == InputState.PURE_ASCII and \
-                    self.ESC_DETECTOR.search(self._last_char + byte_str):
-                self._input_state = InputState.ESC_ASCII
-
-        self._last_char = byte_str[-1:]
-
-        # If we've seen escape sequences, use the EscCharSetProber, which
-        # uses a simple state machine to check for known escape sequences in
-        # HZ and ISO-2022 encodings, since those are the only encodings that
-        # use such sequences.
-        if self._input_state == InputState.ESC_ASCII:
-            if not self._esc_charset_prober:
-                self._esc_charset_prober = EscCharSetProber(self.lang_filter)
-            if self._esc_charset_prober.feed(byte_str) == ProbingState.FOUND_IT:
-                self.result = {'encoding':
-                               self._esc_charset_prober.charset_name,
-                               'confidence':
-                               self._esc_charset_prober.get_confidence(),
-                               'language':
-                               self._esc_charset_prober.language}
-                self.done = True
-        # If we've seen high bytes (i.e., those with values greater than 127),
-        # we need to do more complicated checks using all our multi-byte and
-        # single-byte probers that are left.  The single-byte probers
-        # use character bigram distributions to determine the encoding, whereas
-        # the multi-byte probers use a combination of character unigram and
-        # bigram distributions.
-        elif self._input_state == InputState.HIGH_BYTE:
-            if not self._charset_probers:
-                self._charset_probers = [MBCSGroupProber(self.lang_filter)]
-                # If we're checking non-CJK encodings, use single-byte prober
-                if self.lang_filter & LanguageFilter.NON_CJK:
-                    self._charset_probers.append(SBCSGroupProber())
-                self._charset_probers.append(Latin1Prober())
-            for prober in self._charset_probers:
-                if prober.feed(byte_str) == ProbingState.FOUND_IT:
-                    self.result = {'encoding': prober.charset_name,
-                                   'confidence': prober.get_confidence(),
-                                   'language': prober.language}
-                    self.done = True
-                    break
-            if self.WIN_BYTE_DETECTOR.search(byte_str):
-                self._has_win_bytes = True
-
-    def close(self):
-        """
-        Stop analyzing the current document and come up with a final
-        prediction.
-
-        :returns:  The ``result`` attribute, a ``dict`` with the keys
-                   `encoding`, `confidence`, and `language`.
-        """
-        # Don't bother with checks if we're already done
-        if self.done:
-            return self.result
-        self.done = True
-
-        if not self._got_data:
-            self.logger.debug('no data received!')
-
-        # Default to ASCII if it is all we've seen so far
-        elif self._input_state == InputState.PURE_ASCII:
-            self.result = {'encoding': 'ascii',
-                           'confidence': 1.0,
-                           'language': ''}
-
-        # If we have seen non-ASCII, return the best that met MINIMUM_THRESHOLD
-        elif self._input_state == InputState.HIGH_BYTE:
-            prober_confidence = None
-            max_prober_confidence = 0.0
-            max_prober = None
-            for prober in self._charset_probers:
-                if not prober:
-                    continue
-                prober_confidence = prober.get_confidence()
-                if prober_confidence > max_prober_confidence:
-                    max_prober_confidence = prober_confidence
-                    max_prober = prober
-            if max_prober and (max_prober_confidence > self.MINIMUM_THRESHOLD):
-                charset_name = max_prober.charset_name
-                lower_charset_name = max_prober.charset_name.lower()
-                confidence = max_prober.get_confidence()
-                # Use Windows encoding name instead of ISO-8859 if we saw any
-                # extra Windows-specific bytes
-                if lower_charset_name.startswith('iso-8859'):
-                    if self._has_win_bytes:
-                        charset_name = self.ISO_WIN_MAP.get(lower_charset_name,
-                                                            charset_name)
-                self.result = {'encoding': charset_name,
-                               'confidence': confidence,
-                               'language': max_prober.language}
-
-        # Log all prober confidences if none met MINIMUM_THRESHOLD
-        if self.logger.getEffectiveLevel() <= logging.DEBUG:
-            if self.result['encoding'] is None:
-                self.logger.debug('no probers hit minimum threshold')
-                for group_prober in self._charset_probers:
-                    if not group_prober:
-                        continue
-                    if isinstance(group_prober, CharSetGroupProber):
-                        for prober in group_prober.probers:
-                            self.logger.debug('%s %s confidence = %s',
-                                              prober.charset_name,
-                                              prober.language,
-                                              prober.get_confidence())
-                    else:
-                        self.logger.debug('%s %s confidence = %s',
-                                          group_prober.charset_name,
-                                          group_prober.language,
-                                          group_prober.get_confidence())
-        return self.result
diff --git a/lib/sub_repos/chardet/chardet/utf8prober.py b/lib/sub_repos/chardet/chardet/utf8prober.py
deleted file mode 100644
index 6c3196cc2..000000000
--- a/lib/sub_repos/chardet/chardet/utf8prober.py
+++ /dev/null
@@ -1,82 +0,0 @@
-######################## BEGIN LICENSE BLOCK ########################
-# The Original Code is mozilla.org code.
-#
-# The Initial Developer of the Original Code is
-# Netscape Communications Corporation.
-# Portions created by the Initial Developer are Copyright (C) 1998
-# the Initial Developer. All Rights Reserved.
-#
-# Contributor(s):
-#   Mark Pilgrim - port to Python
-#
-# This library is free software; you can redistribute it and/or
-# modify it under the terms of the GNU Lesser General Public
-# License as published by the Free Software Foundation; either
-# version 2.1 of the License, or (at your option) any later version.
-#
-# This library is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-# Lesser General Public License for more details.
-#
-# You should have received a copy of the GNU Lesser General Public
-# License along with this library; if not, write to the Free Software
-# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
-# 02110-1301  USA
-######################### END LICENSE BLOCK #########################
-
-from .charsetprober import CharSetProber
-from .enums import ProbingState, MachineState
-from .codingstatemachine import CodingStateMachine
-from .mbcssm import UTF8_SM_MODEL
-
-
-
-class UTF8Prober(CharSetProber):
-    ONE_CHAR_PROB = 0.5
-
-    def __init__(self):
-        super(UTF8Prober, self).__init__()
-        self.coding_sm = CodingStateMachine(UTF8_SM_MODEL)
-        self._num_mb_chars = None
-        self.reset()
-
-    def reset(self):
-        super(UTF8Prober, self).reset()
-        self.coding_sm.reset()
-        self._num_mb_chars = 0
-
-    @property
-    def charset_name(self):
-        return "utf-8"
-
-    @property
-    def language(self):
-        return ""
-
-    def feed(self, byte_str):
-        for c in byte_str:
-            coding_state = self.coding_sm.next_state(c)
-            if coding_state == MachineState.ERROR:
-                self._state = ProbingState.NOT_ME
-                break
-            elif coding_state == MachineState.ITS_ME:
-                self._state = ProbingState.FOUND_IT
-                break
-            elif coding_state == MachineState.START:
-                if self.coding_sm.get_current_charlen() >= 2:
-                    self._num_mb_chars += 1
-
-        if self.state == ProbingState.DETECTING:
-            if self.get_confidence() > self.SHORTCUT_THRESHOLD:
-                self._state = ProbingState.FOUND_IT
-
-        return self.state
-
-    def get_confidence(self):
-        unlike = 0.99
-        if self._num_mb_chars < 6:
-            unlike *= self.ONE_CHAR_PROB ** self._num_mb_chars
-            return 1.0 - unlike
-        else:
-            return unlike
diff --git a/lib/sub_repos/chardet/chardet/version.py b/lib/sub_repos/chardet/chardet/version.py
deleted file mode 100644
index 70369b9d6..000000000
--- a/lib/sub_repos/chardet/chardet/version.py
+++ /dev/null
@@ -1,9 +0,0 @@
-"""
-This module exists only to simplify retrieving the version number of chardet
-from within setup.py and from chardet subpackages.
-
-:author: Dan Blanchard (dan.blanchard@gmail.com)
-"""
-
-__version__ = "4.0.0"
-VERSION = __version__.split('.')
diff --git a/lib/sub_repos/chardet/convert_language_model.py b/lib/sub_repos/chardet/convert_language_model.py
deleted file mode 100755
index 191a172e0..000000000
--- a/lib/sub_repos/chardet/convert_language_model.py
+++ /dev/null
@@ -1,242 +0,0 @@
-#!/usr/bin/env python
-# -*- coding: utf-8 -*-
-
-######################## BEGIN LICENSE BLOCK ########################
-# Contributor(s):
-#   10.02.2015 - helour - first attempt
-#   08.08.2016 - Dan Blanchard - first usable release
-#
-# This library is free software; you can redistribute it and/or
-# modify it under the terms of the GNU Lesser General Public
-# License as published by the Free Software Foundation; either
-# version 2.1 of the License, or (at your option) any later version.
-#
-# This library is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-# Lesser General Public License for more details.
-#
-# You should have received a copy of the GNU Lesser General Public
-# License along with this library; if not, write to the Free Software
-# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
-# 02110-1301  USA
-#
-######################### END LICENSE BLOCK #########################
-
-"""
-Convert old style SBCS model to new
-"""
-from __future__ import absolute_import, print_function
-
-import os
-import sys
-from argparse import ArgumentParser, ArgumentDefaultsHelpFormatter
-from io import open
-from string import ascii_letters
-
-import chardet
-from chardet import __version__
-from chardet.compat import iteritems
-from chardet.metadata.languages import LANGUAGES
-from chardet.sbcharsetprober import SingleByteCharSetModel
-
-
-# Turn ascii_letters into a set to make other ops easier
-ascii_letters = set(ascii_letters)
-
-
-def normalize_name(charset_name):
-    """Convert name to proper Python constant format"""
-    # Title case to start
-    charset_name = charset_name.upper()
-    # Underscores instead of hyphens
-    charset_name = charset_name.replace('-', '_')
-    return charset_name
-
-
-def convert_sbcs_model(old_model, alphabet):
-    """Create a SingleByteCharSetModel object representing the charset."""
-    # Setup tables necessary for computing transition frequencies for model
-    char_to_order = {i: order
-                     for i, order in enumerate(old_model['char_to_order_map'])}
-    pos_ratio = old_model['typical_positive_ratio']
-    keep_ascii_letters = old_model['keep_english_letter']
-
-    curr_model = SingleByteCharSetModel(charset_name=old_model['charset_name'],
-                                        language=old_model['language'],
-                                        char_to_order_map=char_to_order,
-                                        # language_model is filled in later
-                                        language_model=None,
-                                        typical_positive_ratio=pos_ratio,
-                                        keep_ascii_letters=keep_ascii_letters,
-                                        alphabet=alphabet)
-    return curr_model
-
-
-def print_char_to_order(var_name, order_map, charset_name, output_file):
-    print('{} = {{'.format(var_name), file=output_file)
-    for char, order in sorted(iteritems(order_map)):
-        char_bytes = bytes(bytearray((char,)))
-        try:
-            unicode_char = char_bytes.decode(charset_name)
-        except UnicodeError:
-            unicode_char = None
-        print('     {!r}: {!r},  # {!r}'.format(char, order, unicode_char),
-              file=output_file)
-    print('}\n', file=output_file)
-
-
-def print_language_model(var_name, language_model, output_file, char_ranks):
-    print('# 3: Positive\n'
-          '# 2: Likely\n'
-          '# 1: Unlikely\n'
-          '# 0: Negative\n',
-          file=output_file)
-    print('{} = {{'.format(var_name), file=output_file)
-    for first_char, sub_dict in sorted(iteritems(language_model)):
-        # Skip empty sub_dicts
-        if not sub_dict or first_char not in char_ranks:
-            continue
-        print('    {!r}: {{  # {!r}'.format(char_ranks[first_char], first_char),
-              file=output_file)
-        for second_char, likelihood in sorted(iteritems(sub_dict)):
-            if second_char not in char_ranks:
-                continue
-            print('        {!r}: {!r},  # {!r}'.format(char_ranks[second_char],
-                                                       likelihood,
-                                                       second_char),
-                  file=output_file)
-        print('    },', file=output_file)
-    print('}\n', file=output_file)
-
-
-def convert_models_for_lang(language):
-    """Convert old SingleByteCharSetModels for the given language"""
-    # Validate language
-    language = language.title()
-    lang_metadata = LANGUAGES.get(language)
-    if not lang_metadata:
-        raise ValueError('Unknown language: {}. If you are adding a model for a'
-                         ' new language, you must first update metadata/'
-                         'languages.py'.format(language))
-    lang_mod_name = 'lang{}model'.format(language.lower())
-    if not os.path.exists(os.path.join('chardet', lang_mod_name + '.py')):
-        print('Skipping {} because it does not have an old model.'
-              .format(language))
-        return
-    lang_mod = getattr(chardet, lang_mod_name)
-    print('\n{}\n----------------------------------------------------------------'
-          .format(language))
-    print('Keep ASCII Letters: {}'.format(lang_metadata.use_ascii))
-    print('Alphabet: {}'.format(lang_metadata.alphabet))
-
-    # Create char-to-order maps (aka char-to-rank dicts)
-    charset_models = {}
-    char_ranks = {}
-    order_to_chars = {}
-    for var_name in dir(lang_mod):
-        if not ('Model' in var_name and 'LangModel' not in var_name):
-            continue
-        old_model = getattr(lang_mod, var_name)
-        charset_name = old_model['charset_name']
-
-        print('Converting charset model for {}'.format(charset_name))
-        sys.stdout.flush()
-        charset_models[charset_name] = convert_sbcs_model(old_model,
-                                                          lang_metadata.alphabet)
-        # Since we don't know which charsets have which characters, we have to
-        # try to reconstruct char_ranks (for letters only, since that's all
-        # the old language models contain)
-        for byte_hex, order in iteritems(charset_models[charset_name].char_to_order_map):
-            # order 64 was basically ignored before because of the off by one
-            # error, but it's hard to know if training took that into account
-            if order > 64:
-                continue
-            # Convert to bytes in Python 2 and 3
-            char = bytes(bytearray((byte_hex,)))
-            try:
-                unicode_char = char.decode(charset_name)
-            except UnicodeDecodeError:
-                continue
-            if unicode_char not in char_ranks:
-                char_ranks[unicode_char] = order
-                order_to_chars[order] = unicode_char
-            elif char_ranks[unicode_char] != order:
-                raise ValueError('Unstable character ranking for {}'.format(unicode_char))
-
-    old_lang_model = getattr(lang_mod, '{}LangModel'.format(language.title()))
-    language_model = {}
-    # Preserve off-by-one error here by ignoring first column and row
-    for i in range(1, 64):
-        if i not in order_to_chars:
-            continue
-        lang_char = order_to_chars[i]
-        language_model[lang_char] = {}
-        for j in range(1, 64):
-            if j not in order_to_chars:
-                continue
-            lang_char2 = order_to_chars[j]
-            language_model[lang_char][lang_char2] = old_lang_model[(i * 64) + j]
-
-    # Write output files
-    print('Writing output file for {}\n\n'.format(language))
-    sys.stdout.flush()
-    with open('lang{}model.py'.format(language.lower()), 'w') as output_file:
-        upper_lang = language.upper()
-        # print header to set encoding
-        print('#!/usr/bin/env python\n'
-              '# -*- coding: utf-8 -*-\n\n'
-              'from chardet.sbcharsetprober import SingleByteCharSetModel\n\n',
-              file=output_file)
-
-        lm_name = '{}_LANG_MODEL'.format(upper_lang)
-        print_language_model(lm_name, language_model, output_file, char_ranks)
-
-        print('# 255: Undefined characters that did not exist in training text\n'
-              '# 254: Carriage/Return\n'
-              '# 253: symbol (punctuation) that does not belong to word\n'
-              '# 252: 0 - 9\n'
-              '# 251: Control characters\n\n'
-              '# Character Mapping Table(s):',
-              file=output_file)
-        for charset_name, sbcs_model in iteritems(charset_models):
-            normal_name = normalize_name(charset_name)
-            char_to_order_name = ('{}_{}_CHAR_TO_ORDER'.format(normal_name,
-                                                               upper_lang))
-            print_char_to_order(char_to_order_name, sbcs_model.char_to_order_map,
-                                charset_name, output_file)
-
-            sbcs_model_name = '{}_{}_MODEL'.format(normal_name, upper_lang)
-            sbcs_model.char_to_order_map.clear()
-            sbcs_model_repr = (repr(sbcs_model)
-                               .replace('None', lm_name)
-                               .replace('{}', char_to_order_name)
-                               .replace(', ', (',\n' +
-                                               ' ' * (len(sbcs_model_name) +
-                                                      26))))
-            print('{} = {}\n'.format(sbcs_model_name, sbcs_model_repr),
-                  file=output_file)
-
-
-def main():
-    parser = ArgumentParser(description=__doc__,
-                            formatter_class=ArgumentDefaultsHelpFormatter)
-    parser.add_argument('language',
-                        help='The name of the language the input documents are '
-                             'in. Also the name of the language the generated '
-                             'model will detect. If no language is specified, '
-                             'models for all languages known to chardet will be'
-                             ' trained.',
-                        nargs='*')
-    parser.add_argument('--version', action='version', version=__version__)
-    args = parser.parse_args()
-
-    if not args.language:
-        args.language = list(sorted(LANGUAGES.keys()))
-
-    for language in args.language:
-        convert_models_for_lang(language)
-
-
-if __name__ == '__main__':
-    main()
\ No newline at end of file
diff --git a/lib/sub_repos/chardet/setup.cfg b/lib/sub_repos/chardet/setup.cfg
deleted file mode 100644
index f4c1dd226..000000000
--- a/lib/sub_repos/chardet/setup.cfg
+++ /dev/null
@@ -1,7 +0,0 @@
-[bdist_wheel]
-universal = 1
-
-[tool:pytest]
-addopts = -v
-python_files = test.py
-norecursedirs = *
diff --git a/lib/sub_repos/chardet/setup.py b/lib/sub_repos/chardet/setup.py
deleted file mode 100755
index d582e21a1..000000000
--- a/lib/sub_repos/chardet/setup.py
+++ /dev/null
@@ -1,53 +0,0 @@
-#!/usr/bin/env python
-
-from setuptools import find_packages, setup
-
-
-# Get version without importing, which avoids dependency issues
-def get_version():
-    import re
-    with open('chardet/version.py') as version_file:
-        return re.search(r"""__version__\s+=\s+(['"])(?P.+?)\1""",
-                         version_file.read()).group('version')
-
-
-def readme():
-    with open('README.rst') as f:
-        return f.read()
-
-
-setup(name='chardet',
-      version=get_version(),
-      description='Universal encoding detector for Python 2 and 3',
-      long_description=readme(),
-      author='Mark Pilgrim',
-      author_email='mark@diveintomark.org',
-      maintainer='Daniel Blanchard',
-      maintainer_email='dan.blanchard@gmail.com',
-      url='https://github.com/chardet/chardet',
-      license="LGPL",
-      keywords=['encoding', 'i18n', 'xml'],
-      classifiers=["Development Status :: 5 - Production/Stable",
-                   "Intended Audience :: Developers",
-                   ("License :: OSI Approved :: GNU Library or Lesser General"
-                    " Public License (LGPL)"),
-                   "Operating System :: OS Independent",
-                   "Programming Language :: Python",
-                   'Programming Language :: Python :: 2',
-                   'Programming Language :: Python :: 2.7',
-                   'Programming Language :: Python :: 3',
-                   'Programming Language :: Python :: 3.5',
-                   'Programming Language :: Python :: 3.6',
-                   'Programming Language :: Python :: 3.7',
-                   'Programming Language :: Python :: 3.8',
-                   'Programming Language :: Python :: 3.9',
-                   ('Programming Language :: Python :: Implementation :: '
-                    'CPython'),
-                   'Programming Language :: Python :: Implementation :: PyPy',
-                   ("Topic :: Software Development :: Libraries :: Python "
-                    "Modules"),
-                   "Topic :: Text Processing :: Linguistic"],
-      packages=find_packages(),
-      python_requires=">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*",
-      entry_points={'console_scripts':
-                    ['chardetect = chardet.cli.chardetect:main']})
diff --git a/lib/sub_repos/chardet/test.py b/lib/sub_repos/chardet/test.py
deleted file mode 100644
index ad2b75368..000000000
--- a/lib/sub_repos/chardet/test.py
+++ /dev/null
@@ -1,146 +0,0 @@
-"""
-Run chardet on a bunch of documents and see that we get the correct encodings.
-
-:author: Dan Blanchard
-:author: Ian Cordasco
-"""
-
-from __future__ import with_statement
-
-import textwrap
-from difflib import ndiff
-from io import open
-from os import listdir
-from os.path import dirname, isdir, join, realpath, relpath, splitext
-
-try:
-    import hypothesis.strategies as st
-    from hypothesis import given, assume, settings, Verbosity
-    HAVE_HYPOTHESIS = True
-except ImportError:
-    HAVE_HYPOTHESIS = False
-import pytest
-
-import chardet
-
-
-# TODO: Restore Hungarian encodings (iso-8859-2 and windows-1250) after we
-#       retrain model.
-MISSING_ENCODINGS = {'iso-8859-2', 'iso-8859-6', 'windows-1250',
-                     'windows-1254', 'windows-1256'}
-EXPECTED_FAILURES = {'tests/iso-8859-7-greek/disabled.gr.xml',
-                     'tests/iso-8859-9-turkish/divxplanet.com.xml',
-                     'tests/iso-8859-9-turkish/subtitle.srt',
-                     'tests/iso-8859-9-turkish/wikitop_tr_ISO-8859-9.txt'}
-
-def gen_test_params():
-    """Yields tuples of paths and encodings to use for test_encoding_detection"""
-    base_path = relpath(join(dirname(realpath(__file__)), 'tests'))
-    for encoding in listdir(base_path):
-        path = join(base_path, encoding)
-        # Skip files in tests directory
-        if not isdir(path):
-            continue
-        # Remove language suffixes from encoding if pressent
-        encoding = encoding.lower()
-        for postfix in ['-arabic', '-bulgarian', '-cyrillic', '-greek',
-                        '-hebrew', '-hungarian', '-turkish']:
-            if encoding.endswith(postfix):
-                encoding = encoding.rpartition(postfix)[0]
-                break
-        # Skip directories for encodings we don't handle yet.
-        if encoding in MISSING_ENCODINGS:
-            continue
-        # Test encoding detection for each file we have of encoding for
-        for file_name in listdir(path):
-            ext = splitext(file_name)[1].lower()
-            if ext not in ['.html', '.txt', '.xml', '.srt']:
-                continue
-            full_path = join(path, file_name)
-            test_case = full_path, encoding
-            if full_path in EXPECTED_FAILURES:
-                test_case = pytest.param(*test_case, marks=pytest.mark.xfail)
-            yield test_case
-
-
-@pytest.mark.parametrize ('file_name, encoding', gen_test_params())
-def test_encoding_detection(file_name, encoding):
-    with open(file_name, 'rb') as f:
-        input_bytes = f.read()
-        result = chardet.detect(input_bytes)
-        try:
-            expected_unicode = input_bytes.decode(encoding)
-        except LookupError:
-            expected_unicode = ''
-        try:
-            detected_unicode = input_bytes.decode(result['encoding'])
-        except (LookupError, UnicodeDecodeError, TypeError):
-            detected_unicode = ''
-    if result:
-        encoding_match = (result['encoding'] or '').lower() == encoding
-    else:
-        encoding_match = False
-    # Only care about mismatches that would actually result in different
-    # behavior when decoding
-    if not encoding_match and expected_unicode != detected_unicode:
-        wrapped_expected = '\n'.join(textwrap.wrap(expected_unicode, 100)) + '\n'
-        wrapped_detected = '\n'.join(textwrap.wrap(detected_unicode, 100)) + '\n'
-        diff = ''.join(ndiff(wrapped_expected.splitlines(True),
-                             wrapped_detected.splitlines(True)))
-    else:
-        diff = ''
-        encoding_match = True
-    assert encoding_match, ("Expected %s, but got %s for %s.  Character "
-                            "differences: \n%s" % (encoding,
-                                                   result,
-                                                   file_name,
-                                                   diff))
-
-
-if HAVE_HYPOTHESIS:
-    class JustALengthIssue(Exception):
-        pass
-
-
-    @pytest.mark.xfail
-    @given(st.text(min_size=1), st.sampled_from(['ascii', 'utf-8', 'utf-16',
-                                                 'utf-32', 'iso-8859-7',
-                                                 'iso-8859-8', 'windows-1255']),
-           st.randoms())
-    @settings(max_examples=200)
-    def test_never_fails_to_detect_if_there_is_a_valid_encoding(txt, enc, rnd):
-        try:
-            data = txt.encode(enc)
-        except UnicodeEncodeError:
-            assume(False)
-        detected = chardet.detect(data)['encoding']
-        if detected is None:
-            with pytest.raises(JustALengthIssue):
-                @given(st.text(), random=rnd)
-                @settings(verbosity=Verbosity.quiet, max_shrinks=0, max_examples=50)
-                def string_poisons_following_text(suffix):
-                    try:
-                        extended = (txt + suffix).encode(enc)
-                    except UnicodeEncodeError:
-                        assume(False)
-                    result = chardet.detect(extended)
-                    if result and result['encoding'] is not None:
-                        raise JustALengthIssue()
-
-
-    @given(st.text(min_size=1), st.sampled_from(['ascii', 'utf-8', 'utf-16',
-                                                 'utf-32', 'iso-8859-7',
-                                                 'iso-8859-8', 'windows-1255']),
-           st.randoms())
-    @settings(max_examples=200)
-    def test_detect_all_and_detect_one_should_agree(txt, enc, rnd):
-        try:
-            data = txt.encode(enc)
-        except UnicodeEncodeError:
-            assume(False)
-        try:
-            result = chardet.detect(data)
-            results = chardet.detect_all(data)
-            assert result['encoding'] == results[0]['encoding']
-        except Exception:
-            raise Exception('%s != %s' % (result, results))
diff --git a/lib/sub_repos/flufl.lock/LICENSE b/lib/sub_repos/flufl.lock/LICENSE
deleted file mode 100644
index 1121e3ec2..000000000
--- a/lib/sub_repos/flufl.lock/LICENSE
+++ /dev/null
@@ -1,13 +0,0 @@
-Copyright 2004-2021 Barry Warsaw
-
-Licensed under the Apache License, Version 2.0 (the "License");
-you may not use this file except in compliance with the License.
-You may obtain a copy of the License at
-
-    http://www.apache.org/licenses/LICENSE-2.0
-
-Unless required by applicable law or agreed to in writing, software
-distributed under the License is distributed on an "AS IS" BASIS,
-WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-See the License for the specific language governing permissions and
-limitations under the License.
diff --git a/lib/sub_repos/flufl.lock/README.rst b/lib/sub_repos/flufl.lock/README.rst
deleted file mode 100644
index 31baf70d7..000000000
--- a/lib/sub_repos/flufl.lock/README.rst
+++ /dev/null
@@ -1,52 +0,0 @@
-==========
-flufl.lock
-==========
-
-NFS-safe file locking with timeouts for POSIX and Windows.
-
-The ``flufl.lock`` library provides an NFS-safe file-based locking algorithm
-influenced by the GNU/Linux ``open(2)`` manpage, under the description of the
-``O_EXCL`` option.
-
-    [...] O_EXCL is broken on NFS file systems, programs which rely on it
-    for performing locking tasks will contain a race condition.  The
-    solution for performing atomic file locking using a lockfile is to
-    create a unique file on the same fs (e.g., incorporating hostname and
-    pid), use link(2) to make a link to the lockfile.  If link() returns
-    0, the lock is successful.  Otherwise, use stat(2) on the unique file
-    to check if its link count has increased to 2, in which case the lock
-    is also successful.
-
-The assumption made here is that there will be no *outside interference*,
-e.g. no agent external to this code will ever ``link()`` to the specific lock
-files used.
-
-Lock objects support lock-breaking so that you can't wedge a process forever.
-This is especially helpful in a web environment, but may not be appropriate
-for all applications.
-
-Locks have a *lifetime*, which is the maximum length of time the process
-expects to retain the lock.  It is important to pick a good number here
-because other processes will not break an existing lock until the expected
-lifetime has expired.  Too long and other processes will hang; too short and
-you'll end up trampling on existing process locks -- and possibly corrupting
-data.  In a distributed (NFS) environment, you also need to make sure that
-your clocks are properly synchronized.
-
-
-Author
-======
-
-``flufl.lock`` is Copyright (C) 2007-2021 Barry Warsaw 
-
-Licensed under the terms of the Apache License Version 2.0.  See the LICENSE
-file for details.
-
-
-Project details
-===============
-
- * Project home: https://gitlab.com/warsaw/flufl.lock
- * Report bugs at: https://gitlab.com/warsaw/flufl.lock/issues
- * Code hosting: https://gitlab.com/warsaw/flufl.lock.git
- * Documentation: https://flufllock.readthedocs.io/
diff --git a/lib/sub_repos/flufl.lock/flufl/lock/__init__.py b/lib/sub_repos/flufl.lock/flufl/lock/__init__.py
deleted file mode 100644
index 0bfad3ffa..000000000
--- a/lib/sub_repos/flufl.lock/flufl/lock/__init__.py
+++ /dev/null
@@ -1,23 +0,0 @@
-# Adapted from: flufl.lock/__init__.py (https://gitlab.com/warsaw/flufl.lock/-/tree/6.0)
-# Copyright 2021 Barry Warsaw
-# Modifications Copyright 2026 Los Alamos National Laboratory
-# Licensed under the Apache License, Version 2.0
-#
-# Modifications:
-# - Adapted to remove dependency on `public` package (2026, Hank Wikle, Los Alamos National Laboratory)
-# - Removed custom `TimeOutError` in favor of native Python `TimeoutError` (2026, Hank Wikle, Los Alamos National Laboratory)
-#
-# Original license text is included in LICENSE file.
-
-
-from flufl.lock._lockfile import (
-    AlreadyLockedError,
-    Lock,
-    LockError,
-    LockState,
-    NotLockedError,
-    SEP,
-)
-
-
-__version__ = '6.0'
diff --git a/lib/sub_repos/flufl.lock/flufl/lock/_lockfile.py b/lib/sub_repos/flufl.lock/flufl/lock/_lockfile.py
deleted file mode 100644
index fb6bdf2e2..000000000
--- a/lib/sub_repos/flufl.lock/flufl/lock/_lockfile.py
+++ /dev/null
@@ -1,643 +0,0 @@
-# Adapted from: flufl.lock/_lockfile.py (https://gitlab.com/warsaw/flufl.lock/-/tree/6.0)
-# Copyright 2021 Barry Warsaw
-# Modifications Copyright 2026 Los Alamos National Laboratory
-# Licensed under the Apache License, Version 2.0
-#
-# Modifications:
-# - Remove dependencies on third-party `psutil`, `public`, and `typing_extensions` packages (2026, Hank Wikle, Los Alamos National Laboratory)
-# - Modified Lock class to take `Path` object instead of string (2026, Hank Wikle, Los Alamos National Laboratory)
-# - Replaced custom `TimeOutError` with native Python `TimeoutError` (2026, Hank Wikle, Los Alamos National Laboratory)
-#
-# Original license text is included in LICENSE file.
-
-import os
-import sys
-import time
-import errno
-import random
-import socket
-import logging
-
-from contextlib import suppress
-from datetime import datetime, timedelta
-from enum import Enum
-from logging import NullHandler
-from pathlib import Path
-from types import TracebackType
-from typing import cast, List, Optional, Tuple, Type, Union
-
-
-Interval = Union[timedelta, int]
-
-# 2020-06-26(bwarsaw): Once Python 3.8 is the minimum, we could annotatey some
-# of these module globals as typing.Final.
-
-
-DEFAULT_LOCK_LIFETIME = timedelta(seconds=15)
-# Allowable a bit of clock skew.
-CLOCK_SLOP = timedelta(seconds=10)
-MAXINT = sys.maxsize
-
-# Details separator; also used in calculating the claim file path.  Lock files
-# should not include this character.  We do it like this so flake8 won't
-# complain about SEP.
-SEP = '^' if sys.platform == 'win32' else '|'
-
-# LP: #977999 - catch both ENOENT and ESTALE.  The latter is what an NFS
-# server should return, but some Linux versions return ENOENT.
-ERRORS = (errno.ENOENT, errno.ESTALE)
-
-log = logging.getLogger('flufl.lock')
-
-# Install a null handler to avoid warnings when applications don't set their
-# own flufl.lock logger.  See http://docs.python.org/library/logging.html
-logging.getLogger('flufl.lock').addHandler(NullHandler())
-
-
-class LockError(Exception):
-    """Base class for all exceptions in this module."""
-
-
-class AlreadyLockedError(LockError):
-    """An attempt is made to lock an already locked object."""
-
-
-class NotLockedError(LockError):
-    """An attempt is made to unlock an object that isn't locked."""
-
-
-class LockState(Enum):
-    """Infer the state of the lock.
-
-    There are cases in which it is impossible to infer the state of the lock,
-    due to the distributed nature of the locking mechanism and environment.
-    However it is possible to provide some insights into the state of the
-    lock.  Note that the policy on what to do with this information is left
-    entirely to the user of the library.
-    """
-
-    #: There is no lock file so the lock is unlocked.
-    unlocked = 1
-    #: We own the lock and it is fresh.
-    ours = 2
-    #: We own the lock but it has expired.  Another process trying
-    #: to acquire the lock will break it.
-    ours_expired = 3
-    #: We don't own the lock; the hostname in the details matches our
-    #: hostname and there is no pid running that matches pid.  Therefore,
-    #: the lock is stale.
-    stale = 4
-    #: Some other process owns the lock (probably) but it has expired.  Another
-    #: process trying to acquire the lock will break it.
-    theirs_expired = 5
-    #: We don't own the lock; either our hostname does not match the
-    #: details, or there is a process (that's not us) with a matching pid.
-    #: The state of the lock is therefore unknown.
-    unknown = 6
-
-
-def _interval_to_datetime(
-    timeout: Optional[Interval] = None,
-) -> Optional[datetime]:
-    if timeout is None:
-        return None
-    if isinstance(timeout, int):
-        timeout = timedelta(seconds=timeout)
-    return datetime.now() + timeout
-
-
-def pid_exists(pid: int) -> bool:
-    """Check whether pid exists in the current process table."""
-
-    if pid <= 0:
-        return False
-    try:
-        # Signal 0 doesn't kill the process, but raises an OSError if the pid doesn't exist.
-        os.kill(pid, 0)
-    except OSError as e:
-        if e.errno == errno.ESRCH:   # No such process
-            return False
-        elif e.errno == errno.EPERM: # Process exists but no permission
-            return True
-        else:
-            raise
-    else:
-        return True
-
-
-class Lock:
-    """Portable, NFS-safe file locking with timeouts for POSIX systems.
-
-    This class implements an NFS-safe file-based locking algorithm
-    influenced by the GNU/Linux open(2) manpage, under the description
-    of the O_EXCL option:
-
-        [...] O_EXCL is broken on NFS file systems, programs which rely on it
-        for performing locking tasks will contain a race condition.  The
-        solution for performing atomic file locking using a lockfile is to
-        create a unique file on the same fs (e.g., incorporating hostname and
-        pid), use link(2) to make a link to the lockfile.  If link() returns
-        0, the lock is successful.  Otherwise, use stat(2) on the unique file
-        to check if its link count has increased to 2, in which case the lock
-        is also successful.
-
-    The assumption made here is that there will be no *outside interference*,
-    e.g. no agent external to this code will ever link() to the specific lock
-    files used.
-
-    The user specifies a *lock file* in the constructor of this class.  This
-    is whatever file system path the user wants to coordinate locks on.  When
-    a process attempts to acquire a lock, it first writes a *claim file* which
-    contains unique details about the lock being acquired (e.g. the lock file
-    name, the hostname, the pid of the process, and a random integer).  Then
-    it attempts to create a hard link from the claim file to the lock file.
-    If no other process has the lock, this hard link succeeds and the process
-    accquires the lock.  If another process already has the lock, the hard
-    link will fail and the lock will not be acquired.  What happens in this
-    and other error conditions are described in the more detailed
-    documentation.
-
-    Lock objects support lock-breaking so that you can't wedge a process
-    forever.  This is especially helpful in a web environment, but may
-    not be appropriate for all applications.
-
-    Locks have a ``lifetime``, which is the maximum length of time the
-    process expects to retain the lock.  It is important to pick a good
-    number here because other processes will not break an existing lock
-    until the expected lifetime has expired.  Too long and other
-    processes will hang; too short and you'll end up trampling on
-    existing process locks -- and possibly corrupting data.  However
-    locks also support extending a lock's lifetime.  In a distributed
-    (NFS) environment, you also need to make sure that your clocks are
-    properly synchronized.
-
-    Each process laying claim to this resource lock will create their own
-    temporary lock file based on the path specified.  An optional lifetime
-    is the length of time that the process expects to hold the lock.
-
-    :param lockfile: The full path to the lock file.
-    :param lifetime: The expected maximum lifetime of the lock, as a
-        timedelta or integer number of seconds, relative to now.  Defaults
-        to 15 seconds.
-    :param separator: The separator character to use in the lock file's
-        file name.  Defaults to the vertical bar (`|`) on POSIX systems
-        and caret (`^`) on Windows.
-    :param default_timeout: Default timeout for approximately how long the lock
-        acquisition attempt should be made. The value given in the `.lock()`
-        call always overrides this.
-    """
-
-    def __init__(
-        self,
-        lockfile: Path,
-        lifetime: Optional[Interval] = None,
-        separator: str = SEP,
-        default_timeout: Optional[Interval] = None,
-    ):
-        """Create the resource lock using the given file name and lifetime."""
-        # The hostname has to be defined before we call _set_claimfile().
-        self._hostname = socket.getfqdn()
-        if lifetime is None:
-            lifetime = DEFAULT_LOCK_LIFETIME
-        self._default_timeout = default_timeout
-        self._lockfile = lockfile
-        # https://github.com/python/mypy/issues/3004
-        self.lifetime = lifetime                    # type: ignore
-        # The separator must be set before we claim the lock.
-        self._separator = separator
-        self._claimfile: Path
-        self._set_claimfile()
-        # For extending the set of NFS errnos that are retried in _read().
-        self._retry_errnos: List[int] = []
-
-    def __repr__(self) -> str:
-        return '<%s %s [%s: %s] pid=%s at %#xx>' % (
-            self.__class__.__name__,
-            self._lockfile,
-            ('locked' if self._is_locked_no_refresh() else 'unlocked'),
-            self._lifetime,
-            os.getpid(),
-            id(self),
-        )
-
-    @property
-    def hostname(self) -> str:
-        """The current machine's host name.
-
-        :return: The current machine's hostname, as used in the `.details`
-            property.
-        """
-        return self._hostname
-
-    @property
-    def details(self) -> Tuple[str, int, str]:
-        """Details as read from the lock file.
-
-        :return: A 3-tuple of hostname, process id, lock file name.
-        :raises NotLockedError: if the lock is not acquired.
-        """
-        try:
-            with open(self._lockfile) as fp:
-                filename = fp.read().strip()
-        except OSError as error:
-            if error.errno in ERRORS:
-                raise NotLockedError('Details are unavailable') from error
-            raise
-        # Rearrange for signature.
-        try:
-            lockfile, hostname, pid, random_ignored = filename.split(
-                self._separator
-            )
-        except ValueError as error:
-            raise NotLockedError('Details are unavailable') from error
-        return hostname, int(pid), lockfile
-
-    @property
-    def state(self) -> LockState:
-        """Infer the state of the lock."""
-        try:
-            with open(self._lockfile) as fp:
-                filename = fp.read().strip()
-        except FileNotFoundError:
-            return LockState.unlocked
-        try:
-            lockfile, hostname, pid_str, random_ignored = filename.split(
-                self._separator
-            )
-            pid = int(pid_str)
-        except (ValueError, TypeError):
-            # The contents of the lock file is corrupt, so we can't know
-            # anything about the state of the lock.
-            return LockState.unknown
-        if hostname != self._hostname:
-            return LockState.unknown
-        if pid == os.getpid():
-            expired = self.expiration < datetime.now()
-            return LockState.ours_expired if expired else LockState.ours
-        if pid_exists(pid):
-            expired = self.expiration < datetime.now()
-            return LockState.theirs_expired if expired else LockState.unknown
-        return LockState.stale
-
-    @property
-    def lifetime(self) -> timedelta:
-        """The current lock life time."""
-        return self._lifetime
-
-    @lifetime.setter
-    def lifetime(self, lifetime: Interval) -> None:
-        if isinstance(lifetime, timedelta):
-            self._lifetime = lifetime
-        else:
-            self._lifetime = timedelta(seconds=lifetime)
-
-    def refresh(
-        self,
-        lifetime: Optional[Interval] = None,
-        *,
-        unconditionally: bool = False
-    ) -> None:
-        """Refreshes the lifetime of a locked file.
-
-        Use this if you realize that you need to keep a resource locked longer
-        than you thought.
-
-        :param lifetime: If given, this sets the lock's new lifetime.  It
-            represents the number of seconds into the future that the
-            lock's lifetime will expire, relative to now, or whenever it is
-            refreshed, either explicitly or implicitly.  If not given, the
-            original lifetime interval is used.
-        :param unconditionally: When False (the default), a ``NotLockedError``
-            is raised if an unlocked lock is refreshed.
-        :raises NotLockedError: if the lock is not set, unless optional
-            ``unconditionally`` flag is set to True.
-        """
-        if lifetime is not None:
-            # https://github.com/python/mypy/issues/3004
-            self.lifetime = lifetime                # type: ignore
-        # Do we have the lock?  As a side effect, this refreshes the lock!
-        if not self.is_locked and not unconditionally:
-            raise NotLockedError('{}: {}'.format(repr(self), self._read()))
-
-    def lock(self, timeout: Optional[Interval] = None) -> None:
-        """Acquire the lock.
-
-        This blocks until the lock is acquired unless optional timeout is not
-        None, in which case a ``TimeoutError`` is raised when the timeout
-        expires without lock acquisition.
-
-        :param timeout: Approximately how long the lock acquisition attempt
-            should be made.  None (the default) means keep trying forever.
-        :raises AlreadyLockedError: if the lock is already acquired.
-        :raises TimeoutError: if ``timeout`` is not None and the indicated
-            time interval expires without a lock acquisition.
-        """
-        timeout_time = _interval_to_datetime(
-            self._default_timeout if timeout is None else timeout
-        )
-        # Make sure the claim file exists, and that its contents are current.
-        self._write()
-        # XXX This next call can fail with an EPERM.  I have no idea why, but
-        # I'm nervous about ignoring it.  It seems to be a very rare
-        # occurrence, only happens from cron, and has only(?) been observed on
-        # Solaris 2.6.
-        self._touch()
-        log.debug('laying claim: {}'.format(self._lockfile))
-        # For quieting the logging output.
-        loopcount = -1
-        while True:
-            loopcount += 1
-            # Create the hard link from the claim file to the lock file and
-            # test for a hard count of exactly 2 links.
-            try:
-                os.link(self._claimfile, self._lockfile)
-                # If we got here, we know we got the lock, and never
-                # had it before, so we're done.  Just touch it again for the
-                # fun of it.
-                log.debug('got the lock: {}'.format(self._lockfile))
-                self._touch()
-                break
-            except OSError as error:
-                # The link failed for some reason, possibly because someone
-                # else already has the lock (i.e. we got an EEXIST), or for
-                # some other bizarre reason.
-                if error.errno in ERRORS:
-                    # XXX in some Linux environments, it is possible to get an
-                    # ENOENT, which is truly strange, because this means that
-                    # self._claimfile didn't exist at the time of the
-                    # os.link(), but self._write() is supposed to guarantee
-                    # that this happens!  I don't honestly know why this
-                    # happens -- possibly due to weird caching file systems?
-                    # -- but for now we just say we didn't acquire the lock
-                    # and try again next time.
-                    pass
-                elif error.errno != errno.EEXIST:
-                    # Something very bizarre happened.  Clean up our state and
-                    # pass the error on up.
-                    log.exception('unexpected link')
-                    os.unlink(self._claimfile)
-                    raise
-                elif self._linkcount != 2:
-                    # Somebody's messin' with us!  Log this, and try again
-                    # later.  XXX should we raise an exception?
-                    log.error(
-                        'unexpected linkcount: {0:d}'.format(self._linkcount)
-                    )
-                elif self._read() == str(self._claimfile):
-                    # It was us that already had the link.
-                    log.debug('already locked: {}'.format(self._lockfile))
-                    raise AlreadyLockedError('We already had the lock')
-                # Otherwise, someone else has the lock
-                pass
-            # We did not acquire the lock, because someone else already has
-            # it.  Have we timed out in our quest for the lock?
-            if timeout_time is not None and timeout_time < datetime.now():
-                os.unlink(self._claimfile)
-                log.error('timed out')
-                raise TimeoutError('Could not acquire the lock')
-            # Okay, we haven't timed out, but we didn't get the lock.  Let's
-            # find out if the lock lifetime has expired.  Cache the release
-            # time to avoid race conditions.  (LP: #827052)
-            release_time = self._releasetime
-            if release_time != -1:
-                now = datetime.now()
-                future = cast(datetime, release_time) + CLOCK_SLOP
-                if now > future:
-                    # Yes, so break the lock.
-                    self._break()
-                log.error('lifetime has expired, breaking')
-            # Okay, someone else has the lock, our claim hasn't timed out yet,
-            # and the expected lock lifetime hasn't expired yet either.  So
-            # let's wait a while for the owner of the lock to give it up.
-            elif not loopcount % 100:
-                log.debug('waiting for claim: {}'.format(self._lockfile))
-            self._sleep()
-
-    # 2020-06-27(bwarsaw): `unconditionally` should really be a keyword-only
-    # argument, but those didn't exist when this library was originally
-    # written, and changing that now would be a needless backward incompatible
-    # API break.
-    def unlock(self, *, unconditionally: bool = False) -> None:
-        """Release the lock.
-
-        :param unconditionally: When False (the default), a ``NotLockedError``
-            is raised if this is called on an unlocked lock.
-        :raises NotLockedError: if we don't own the lock, either because of
-            unbalanced unlock calls, or because the lock was stolen out from
-            under us, unless optional ``unconditionally`` is True.
-        """
-        is_locked = self.is_locked
-        if not is_locked and not unconditionally:
-            raise NotLockedError('Already unlocked')
-        # If we owned the lock, remove the lockfile, relinquishing the lock.
-        if is_locked:
-            try:
-                os.unlink(self._lockfile)
-            except OSError as error:
-                if error.errno not in ERRORS:
-                    raise
-        # Remove our claim file.
-        try:
-            os.unlink(self._claimfile)
-        except OSError as error:
-            if error.errno not in ERRORS:
-                raise
-        log.debug('unlocked: {}'.format(self._lockfile))
-
-    def _is_locked_no_refresh(self) -> bool:
-        """Don't refresh the lock, just return the status."""
-        # XXX Can the link count ever be > 2?
-        if self._linkcount != 2:
-            return False
-        return self._read() == str(self._claimfile)
-
-    @property
-    def is_locked(self) -> bool:
-        """True if we own the lock, False if we do not.
-
-        Checking the status of the lock resets the lock's lifetime, which
-        helps avoid race conditions during the lock status test.
-        """
-        # Discourage breaking the lock for a while.
-        try:
-            self._touch()
-        except PermissionError:
-            # We can't touch the file because we're not the owner.  I don't see
-            # how we can own the lock if we're not the owner.
-            log.error('No permission to refresh the log')
-            return False
-        return self._is_locked_no_refresh()
-
-    def __enter__(self) -> 'Lock':
-        self.lock()
-        return self
-
-    def __exit__(
-        self,
-        exc_type: Optional[Type[BaseException]],
-        exc_val: Optional[BaseException],
-        exc_tb: Optional[TracebackType],
-    ) -> bool:
-        self.unlock()
-        # Don't suppress any exception that might have occurred.
-        return False
-
-    def _set_claimfile(self) -> None:
-        """Set the _claimfile private variable."""
-        # Calculate a hard link file name that will be used to lay claim to
-        # the lock.  We need to watch out for two Lock objects in the same
-        # process pointing to the same lock file.  Without this, if you lock
-        # lf1 and do not lock lf2, lf2.locked() will still return True.
-        self._claimfile = Path(self._separator.join(
-            (
-                str(self._lockfile),
-                self.hostname,
-                str(os.getpid()),
-                str(random.randint(0, MAXINT)),
-            )
-        ))
-
-    def _write(self) -> None:
-        """Write our claim file's name to the claim file."""
-        # Make sure it's group writable.
-        with open(self._claimfile, 'w') as fp:
-            fp.write(str(self._claimfile))
-
-    @property
-    def retry_errnos(self) -> List[int]:
-        """The set of errno values that cause a read retry."""
-        return self._retry_errnos[:]
-
-    @retry_errnos.setter
-    def retry_errnos(self, errnos: List[int]) -> None:
-        self._retry_errnos = []
-        self._retry_errnos.extend(errnos)
-
-    @retry_errnos.deleter
-    def retry_errnos(self) -> None:
-        self._retry_errnos = []
-
-    @property
-    def expiration(self) -> datetime:
-        """The lock's expiration time, regardless of ownership."""
-        return datetime.fromtimestamp(os.stat(self._lockfile).st_mtime)
-
-    @property
-    def lockfile(self) -> str:
-        """Return the lock file name."""
-        return self._lockfile
-
-    def _read(self) -> Optional[str]:
-        """Read the contents of our lock file.
-
-        :return: The contents of the lock file or None if the lock file does
-            not exist.
-        """
-        while True:
-            try:
-                with open(self._lockfile) as fp:
-                    return fp.read()
-            except EnvironmentError as error:
-                if error.errno in self._retry_errnos:
-                    self._sleep()
-                elif error.errno not in ERRORS:
-                    raise
-                else:
-                    return None
-
-    def _touch(self, filename: Optional[str] = None) -> None:
-        """Touch the claim file into the future.
-
-        :param filename: If given, the file to touch, otherwise our claim file
-            is touched.
-        """
-        expiration_date = datetime.now() + self._lifetime
-        t = time.mktime(expiration_date.timetuple())
-        try:
-            # XXX We probably don't need to modify atime, but this is easier.
-            os.utime(filename or self._claimfile, (t, t))
-        except OSError as error:
-            if error.errno not in ERRORS:
-                raise
-
-    @property
-    def _releasetime(self) -> Union[int, datetime]:
-        """The time when the lock should be released.
-
-        :return: The mtime of the file, which is when the lock should be
-            released, or -1 if the lockfile doesn't exist.
-        """
-        try:
-            return self.expiration
-        except OSError as error:
-            if error.errno in ERRORS:
-                return -1
-            raise
-
-    @property
-    def _linkcount(self) -> int:
-        """The number of hard links to the lock file.
-
-        :return: the number of hard links to the lock file, or -1 if the lock
-            file doesn't exist.
-        """
-        try:
-            return os.stat(self._lockfile).st_nlink
-        except OSError as error:
-            if error.errno in ERRORS:
-                return -1
-            raise
-
-    def _break(self) -> None:
-        """Break the lock."""
-        # Try to read from the lock file.  All we care about is that its
-        # contents have the details expected of any lock file.  If not, then
-        # this probably isn't a lock that needs breaking, it's a Lock with a
-        # lock file pointing to an existing, unrelated file.  Refuse to break
-        # that lock.  All we really need to do is to log and return.  If a
-        # timeout was given, eventually the .lock() call will timeout.
-        # However if no timeout was given, the .lock() will block forever.
-        try:
-            self.details
-        except NotLockedError:
-            log.error(
-                "lockfile exists but isn't safe to break: {}".format(
-                    self._lockfile
-                )
-            )
-            return
-        # Touch the lock file.  This reduces but does not eliminate the
-        # chance for a race condition during breaking.  Two processes could
-        # both pass the test for lock expiry in lock() before one of them gets
-        # to touch the lock file.  This shouldn't be too bad because all
-        # they'll do in that function is delete the lock files, not claim the
-        # lock, and we can be defensive for ENOENTs here.
-        #
-        # Touching the lock could fail if the process breaking the lock and
-        # the process that claimed the lock have different owners.  Don't do
-        # that.
-        with suppress(PermissionError):
-            self._touch(self._lockfile)
-        # Get the name of the old winner's claim file.
-        winner = self._read()
-        # Remove the global lockfile, which actually breaks the lock.
-        try:
-            os.unlink(self._lockfile)
-        except OSError as error:                    # pragma: nocover
-            if error.errno not in ERRORS:
-                raise
-        # Try to remove the old winner's claim file, since we're assuming the
-        # winner process has hung or died.  Don't worry too much if we can't
-        # unlink their claim file -- this doesn't wreck the locking algorithm,
-        # but will leave claim file turds laying around, a minor inconvenience.
-        try:
-            if winner:                              # pragma: nobranch
-                os.unlink(winner)
-        except OSError as error:
-            if error.errno not in ERRORS:           # pragma: nocover
-                raise
-
-    def _sleep(self) -> None:
-        """Snooze for a random amount of time."""
-        interval = random.random() * 2.0 + 0.01
-        time.sleep(interval)
diff --git a/lib/sub_repos/idna/HISTORY.rst b/lib/sub_repos/idna/HISTORY.rst
deleted file mode 100644
index 86fe01bbe..000000000
--- a/lib/sub_repos/idna/HISTORY.rst
+++ /dev/null
@@ -1,196 +0,0 @@
-.. :changelog:
-
-History
--------
-
-3.3 (2021-10-13)
-++++++++++++++++
-
-- Update to Unicode 14.0.0
-- Update to in-line type annotations
-- Throw IDNAError exception correctly for some malformed input
-- Advertise support for Python 3.10
-- Improve testing regime on Github
-- Fix Russian typo in documentation
-
-Thanks to Jon Defresne, Hugo van Kemenade, Seth Michael Larson,
-Patrick Ventuzelo and Boris Verhovsky for contributions to this
-release.
-
-3.2 (2021-05-29)
-++++++++++++++++
-
-- Add type hints (Thanks, Seth Michael Larson!)
-- Remove support for Python 3.4
-
-3.1 (2021-01-04)
-++++++++++++++++
-
-- Ensure license is included in package (Thanks, Julien Schueller)
-- No longer mark wheel has universal (Thanks, Matthieu Darbois)
-- Test on PowerPC using Travis CI
-
-3.0 (2021-01-01)
-++++++++++++++++
-
-- Python 2 is no longer supported (the 2.x branch supports Python 2,
-  use "idna<3" in your requirements file if you need Python 2 support)
-- Support for V2 UTS 46 test vectors.
-
-2.10 (2020-06-27)
-+++++++++++++++++
-
-- Update to Unicode 13.0.0.
-- Throws a more specific exception if "xn--" is provided as a label.
-- This is expected to be the last version that supports Python 2.
-
-2.9 (2020-02-16)
-++++++++++++++++
-
-- Update to Unicode 12.1.0.
-- Prohibit A-labels ending with a hyphen (Thanks, Julien Bernard!)
-- Future-proofing: Test on Python 3.7 and 3.8, don't immediately
-  fail should Python 4 come along.
-- Made BSD 3-clause license clearer
-
-2.8 (2018-12-04)
-++++++++++++++++
-
-- Update to Unicode 11.0.0.
-- Provide more specific exceptions for some malformed labels.
-
-2.7 (2018-06-10)
-++++++++++++++++
-
-- Update to Unicode 10.0.0.
-- No longer accepts dot-prefixed domains (e.g. ".example") as valid.
-  This is to be more conformant with the UTS 46 spec. Users should
-  strip dot prefixes from domains before processing.
-
-2.6 (2017-08-08)
-++++++++++++++++
-
-- Allows generation of IDNA and UTS 46 table data for different
-  versions of Unicode, by deriving properties directly from
-  Unicode data.
-- Ability to generate RFC 5892/IANA-style table data
-- Diagnostic output of IDNA-related Unicode properties and
-  derived calculations for a given codepoint
-- Support for idna.__version__ to report version
-- Support for idna.idnadata.__version__ and
-  idna.uts46data.__version__ to report Unicode version of
-  underlying IDNA and UTS 46 data respectively.
-
-2.5 (2017-03-07)
-++++++++++++++++
-
-- Fix bug with Katakana middle dot context-rule (Thanks, Greg
-  Shikhman.)
-
-2.4 (2017-03-01)
-++++++++++++++++
-
-- Restore IDNAError to be a subclass of UnicodeError, as some users of
-  this library are only looking for the latter to catch invalid strings.
-
-2.3 (2017-02-28)
-++++++++++++++++
-
-- Fix bugs relating to deriving IDNAError from UnicodeError.
-- More memory footprint improvements (Thanks, Alex Gaynor)
-
-2.2 (2016-12-21)
-++++++++++++++++
-
-- Made some changes to the UTS 46 data that should allow Jython to get around
-  64kb Java class limits. (Thanks, John A. Booth and Marcin Płonka.)
-- In Python 2.6, skip two tests that rely on data not present in that
-  Python version's unicodedata module.
-- Use relative imports to help downstream users.
-
-2.1 (2016-03-20)
-++++++++++++++++
-
-- Memory consumption optimizations. The library should consume significantly
-  less memory through smarter data structures being used to represent
-  relevant Unicode properties. Many thanks to Shivaram Lingamneni for this
-  patch.
-- Patches to make library work better with Python 2.6. The core library
-  currently works however the unit testing does not. (Thanks, Robert
-  Buchholz)
-- Better affix all Unicode codepoint properties to a specific version.
-
-2.0 (2015-05-18)
-++++++++++++++++
-
-- Added support for Unicode IDNA Compatibility Processing (aka Unicode
-  Technical Standard #46). Big thanks to Jon Ribbens who contributed this
-  functionality.
-
-1.1 (2015-01-27)
-++++++++++++++++
-
-- Use IDNA properties from Unicode 6.3.0. Internet Architecture Board (IAB)
-  issued statement recommending against the use of Unicode 7.0.0 until
-  issues relating to U+08A1 codepoint are resolved. See http://goo.gl/Ed1n0K
-- Identify some cases when label would be too longer to be a legal DNS name
-  and raise an exception. (Thanks, Ed Lewis)
-
-1.0 (2014-10-12)
-++++++++++++++++
-
-- Update IDNA properties for Unicode 7.0.0.
-
-0.9 (2014-07-18)
-++++++++++++++++
-
-- Fix issue with non-UTF-8 environments reading the README file
-  now that it contains non-ASCII. (Thanks, Tom Prince)
-- Codec functions are useful, so they are separated into their own
-  module, rather than just existing for compatibility reasons.
-- Add LICENSE file.
-
-0.8 (2014-07-09)
-++++++++++++++++
-
-- Added MANIFEST.in for correct source distribution compilation.
-
-0.7 (2014-07-09)
-++++++++++++++++
-
-- Filled out missing tests for various functions.
-- Fix bug in CONTEXTO validation for Greek lower numeral sign (U+0375)
-- Fix bug in CONTEXTO validation for Japanese middle dot (U+30FB)
-- Improved documentation
-- Move designation to Stable
-
-0.6 (2014-04-29)
-++++++++++++++++
-
-- Minor improvements to Python 3 support, tests (Thanks, Derek Wilson)
-
-0.5 (2014-02-05)
-++++++++++++++++
-
-- Update IDNA properties for Unicode 6.3.0.
-
-0.4 (2014-01-07)
-++++++++++++++++
-
-- Fix trove classifier for Python 3. (Thanks, Hynek Schlawack)
-
-0.3 (2013-07-18)
-++++++++++++++++
-
-- Ported to Python 3.
-
-0.2 (2013-07-16)
-++++++++++++++++
-
-- Improve packaging.
-- More conformant, passes all relevant tests in the Unicode TR46 test suite.
-
-0.1 (2013-05-27)
-++++++++++++++++
-
-- First proof-of-concept version.
diff --git a/lib/sub_repos/idna/LICENSE.md b/lib/sub_repos/idna/LICENSE.md
deleted file mode 100644
index b6f87326f..000000000
--- a/lib/sub_repos/idna/LICENSE.md
+++ /dev/null
@@ -1,29 +0,0 @@
-BSD 3-Clause License
-
-Copyright (c) 2013-2021, Kim Davies
-All rights reserved.
-
-Redistribution and use in source and binary forms, with or without
-modification, are permitted provided that the following conditions are met:
-
-1. Redistributions of source code must retain the above copyright notice, this
-   list of conditions and the following disclaimer.
-
-2. Redistributions in binary form must reproduce the above copyright notice,
-   this list of conditions and the following disclaimer in the documentation
-   and/or other materials provided with the distribution.
-
-3. Neither the name of the copyright holder nor the names of its
-   contributors may be used to endorse or promote products derived from
-   this software without specific prior written permission.
-
-THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
-AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
-IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
-DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
-FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
-DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
-SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
-CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
-OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
diff --git a/lib/sub_repos/idna/MANIFEST.in b/lib/sub_repos/idna/MANIFEST.in
deleted file mode 100644
index 3d746f67e..000000000
--- a/lib/sub_repos/idna/MANIFEST.in
+++ /dev/null
@@ -1,8 +0,0 @@
-include *.rst
-include LICENSE.md
-include idna/py.typed
-recursive-include tools *
-recursive-exclude tools *.pyc
-recursive-include tests *
-recursive-exclude tests *.pyc
-
diff --git a/lib/sub_repos/idna/README.rst b/lib/sub_repos/idna/README.rst
deleted file mode 100644
index 31af3e521..000000000
--- a/lib/sub_repos/idna/README.rst
+++ /dev/null
@@ -1,204 +0,0 @@
-Internationalized Domain Names in Applications (IDNA)
-=====================================================
-
-Support for the Internationalised Domain Names in Applications
-(IDNA) protocol as specified in `RFC 5891 `_.
-This is the latest version of the protocol and is sometimes referred to as
-“IDNA 2008â€.
-
-This library also provides support for Unicode Technical Standard 46,
-`Unicode IDNA Compatibility Processing `_.
-
-This acts as a suitable replacement for the “encodings.idna†module that
-comes with the Python standard library, but which only supports the
-older superseded IDNA specification (`RFC 3490 `_).
-
-Basic functions are simply executed:
-
-.. code-block:: pycon
-
-    >>> import idna
-    >>> idna.encode('ドメイン.テスト')
-    b'xn--eckwd4c7c.xn--zckzah'
-    >>> print(idna.decode('xn--eckwd4c7c.xn--zckzah'))
-    ドメイン.テスト
-
-
-Installation
-------------
-
-To install this library, you can use pip:
-
-.. code-block:: bash
-
-    $ pip install idna
-
-Alternatively, you can install the package using the bundled setup script:
-
-.. code-block:: bash
-
-    $ python setup.py install
-
-
-Usage
------
-
-For typical usage, the ``encode`` and ``decode`` functions will take a domain
-name argument and perform a conversion to A-labels or U-labels respectively.
-
-.. code-block:: pycon
-
-    >>> import idna
-    >>> idna.encode('ドメイン.テスト')
-    b'xn--eckwd4c7c.xn--zckzah'
-    >>> print(idna.decode('xn--eckwd4c7c.xn--zckzah'))
-    ドメイン.テスト
-
-You may use the codec encoding and decoding methods using the
-``idna.codec`` module:
-
-.. code-block:: pycon
-
-    >>> import idna.codec
-    >>> print('домен.иÑпытание'.encode('idna'))
-    b'xn--d1acufc.xn--80akhbyknj4f'
-    >>> print(b'xn--d1acufc.xn--80akhbyknj4f'.decode('idna'))
-    домен.иÑпытание
-
-Conversions can be applied at a per-label basis using the ``ulabel`` or ``alabel``
-functions if necessary:
-
-.. code-block:: pycon
-
-    >>> idna.alabel('测试')
-    b'xn--0zwm56d'
-
-Compatibility Mapping (UTS #46)
-+++++++++++++++++++++++++++++++
-
-As described in `RFC 5895 `_, the IDNA
-specification does not normalize input from different potential ways a user
-may input a domain name. This functionality, known as a “mappingâ€, is 
-considered by the specification to be a local user-interface issue distinct
-from IDNA conversion functionality.
-
-This library provides one such mapping, that was developed by the Unicode
-Consortium. Known as `Unicode IDNA Compatibility Processing `_,
-it provides for both a regular mapping for typical applications, as well as
-a transitional mapping to help migrate from older IDNA 2003 applications.
-
-For example, “Königsgäßchen†is not a permissible label as *LATIN CAPITAL
-LETTER K* is not allowed (nor are capital letters in general). UTS 46 will
-convert this into lower case prior to applying the IDNA conversion.
-
-.. code-block:: pycon
-
-    >>> import idna
-    >>> idna.encode('Königsgäßchen')
-    ...
-    idna.core.InvalidCodepoint: Codepoint U+004B at position 1 of 'Königsgäßchen' not allowed
-    >>> idna.encode('Königsgäßchen', uts46=True)
-    b'xn--knigsgchen-b4a3dun'
-    >>> print(idna.decode('xn--knigsgchen-b4a3dun'))
-    königsgäßchen
-
-Transitional processing provides conversions to help transition from the older
-2003 standard to the current standard. For example, in the original IDNA
-specification, the *LATIN SMALL LETTER SHARP S* (ß) was converted into two
-*LATIN SMALL LETTER S* (ss), whereas in the current IDNA specification this
-conversion is not performed.
-
-.. code-block:: pycon
-
-    >>> idna.encode('Königsgäßchen', uts46=True, transitional=True)
-    'xn--knigsgsschen-lcb0w'
-
-Implementors should use transitional processing with caution, only in rare
-cases where conversion from legacy labels to current labels must be performed
-(i.e. IDNA implementations that pre-date 2008). For typical applications
-that just need to convert labels, transitional processing is unlikely to be
-beneficial and could produce unexpected incompatible results.
-
-``encodings.idna`` Compatibility
-++++++++++++++++++++++++++++++++
-
-Function calls from the Python built-in ``encodings.idna`` module are
-mapped to their IDNA 2008 equivalents using the ``idna.compat`` module.
-Simply substitute the ``import`` clause in your code to refer to the
-new module name.
-
-Exceptions
-----------
-
-All errors raised during the conversion following the specification should
-raise an exception derived from the ``idna.IDNAError`` base class.
-
-More specific exceptions that may be generated as ``idna.IDNABidiError``
-when the error reflects an illegal combination of left-to-right and
-right-to-left characters in a label; ``idna.InvalidCodepoint`` when
-a specific codepoint is an illegal character in an IDN label (i.e.
-INVALID); and ``idna.InvalidCodepointContext`` when the codepoint is
-illegal based on its positional context (i.e. it is CONTEXTO or CONTEXTJ
-but the contextual requirements are not satisfied.)
-
-Building and Diagnostics
-------------------------
-
-The IDNA and UTS 46 functionality relies upon pre-calculated lookup
-tables for performance. These tables are derived from computing against
-eligibility criteria in the respective standards. These tables are
-computed using the command-line script ``tools/idna-data``.
-
-This tool will fetch relevant codepoint data from the Unicode repository 
-and perform the required calculations to identify eligibility. There are 
-three main modes:
-
-* ``idna-data make-libdata``. Generates ``idnadata.py`` and ``uts46data.py``,
-  the pre-calculated lookup tables using for IDNA and UTS 46 conversions. Implementors
-  who wish to track this library against a different Unicode version may use this tool
-  to manually generate a different version of the ``idnadata.py`` and ``uts46data.py``
-  files.
-
-* ``idna-data make-table``. Generate a table of the IDNA disposition
-  (e.g. PVALID, CONTEXTJ, CONTEXTO) in the format found in Appendix B.1 of RFC
-  5892 and the pre-computed tables published by `IANA `_.
-
-* ``idna-data U+0061``. Prints debugging output on the various properties
-  associated with an individual Unicode codepoint (in this case, U+0061), that are
-  used to assess the IDNA and UTS 46 status of a codepoint. This is helpful in debugging
-  or analysis.
-
-The tool accepts a number of arguments, described using ``idna-data -h``. Most notably,
-the ``--version`` argument allows the specification of the version of Unicode to use
-in computing the table data. For example, ``idna-data --version 9.0.0 make-libdata``
-will generate library data against Unicode 9.0.0.
-
-
-Additional Notes
-----------------
-
-* **Packages**. The latest tagged release version is published in the
-  `Python Package Index `_.
-
-* **Version support**. This library supports Python 3.5 and higher. As this library
-  serves as a low-level toolkit for a variety of applications, many of which strive
-  for broad compatibility with older Python versions, there is no rush to remove
-  older intepreter support. Removing support for older versions should be well
-  justified in that the maintenance burden has become too high.
-
-* **Python 2**. Python 2 is supported by version 2.x of this library. While active
-  development of the version 2.x series has ended, notable issues being corrected
-  may be backported to 2.x. Use "idna<3" in your requirements file if you need this
-  library for a Python 2 application.
-
-* **Testing**. The library has a test suite based on each rule of the IDNA specification, as
-  well as tests that are provided as part of the Unicode Technical Standard 46,
-  `Unicode IDNA Compatibility Processing `_.
-
-* **Emoji**. It is an occasional request to support emoji domains in this library. Encoding
-  of symbols like emoji is expressly prohibited by the technical standard IDNA 2008 and
-  emoji domains are broadly phased out across the domain industry due to associated security
-  risks. For now, applications that wish need to support these non-compliant labels may
-  wish to consider trying the encode/decode operation in this library first, and then falling
-  back to using `encodings.idna`. See `the Github project `_
-  for more discussion.
\ No newline at end of file
diff --git a/lib/sub_repos/idna/idna/__init__.py b/lib/sub_repos/idna/idna/__init__.py
deleted file mode 100644
index a40eeafcc..000000000
--- a/lib/sub_repos/idna/idna/__init__.py
+++ /dev/null
@@ -1,44 +0,0 @@
-from .package_data import __version__
-from .core import (
-    IDNABidiError,
-    IDNAError,
-    InvalidCodepoint,
-    InvalidCodepointContext,
-    alabel,
-    check_bidi,
-    check_hyphen_ok,
-    check_initial_combiner,
-    check_label,
-    check_nfc,
-    decode,
-    encode,
-    ulabel,
-    uts46_remap,
-    valid_contextj,
-    valid_contexto,
-    valid_label_length,
-    valid_string_length,
-)
-from .intranges import intranges_contain
-
-__all__ = [
-    "IDNABidiError",
-    "IDNAError",
-    "InvalidCodepoint",
-    "InvalidCodepointContext",
-    "alabel",
-    "check_bidi",
-    "check_hyphen_ok",
-    "check_initial_combiner",
-    "check_label",
-    "check_nfc",
-    "decode",
-    "encode",
-    "intranges_contain",
-    "ulabel",
-    "uts46_remap",
-    "valid_contextj",
-    "valid_contexto",
-    "valid_label_length",
-    "valid_string_length",
-]
diff --git a/lib/sub_repos/idna/idna/codec.py b/lib/sub_repos/idna/idna/codec.py
deleted file mode 100644
index 1ca9ba62c..000000000
--- a/lib/sub_repos/idna/idna/codec.py
+++ /dev/null
@@ -1,112 +0,0 @@
-from .core import encode, decode, alabel, ulabel, IDNAError
-import codecs
-import re
-from typing import Tuple, Optional
-
-_unicode_dots_re = re.compile('[\u002e\u3002\uff0e\uff61]')
-
-class Codec(codecs.Codec):
-
-    def encode(self, data: str, errors: str = 'strict') -> Tuple[bytes, int]:
-        if errors != 'strict':
-            raise IDNAError('Unsupported error handling \"{}\"'.format(errors))
-
-        if not data:
-            return b"", 0
-
-        return encode(data), len(data)
-
-    def decode(self, data: bytes, errors: str = 'strict') -> Tuple[str, int]:
-        if errors != 'strict':
-            raise IDNAError('Unsupported error handling \"{}\"'.format(errors))
-
-        if not data:
-            return '', 0
-
-        return decode(data), len(data)
-
-class IncrementalEncoder(codecs.BufferedIncrementalEncoder):
-    def _buffer_encode(self, data: str, errors: str, final: bool) -> Tuple[str, int]:  # type: ignore
-        if errors != 'strict':
-            raise IDNAError('Unsupported error handling \"{}\"'.format(errors))
-
-        if not data:
-            return "", 0
-
-        labels = _unicode_dots_re.split(data)
-        trailing_dot = ''
-        if labels:
-            if not labels[-1]:
-                trailing_dot = '.'
-                del labels[-1]
-            elif not final:
-                # Keep potentially unfinished label until the next call
-                del labels[-1]
-                if labels:
-                    trailing_dot = '.'
-
-        result = []
-        size = 0
-        for label in labels:
-            result.append(alabel(label))
-            if size:
-                size += 1
-            size += len(label)
-
-        # Join with U+002E
-        result_str = '.'.join(result) + trailing_dot  # type: ignore
-        size += len(trailing_dot)
-        return result_str, size
-
-class IncrementalDecoder(codecs.BufferedIncrementalDecoder):
-    def _buffer_decode(self, data: str, errors: str, final: bool) -> Tuple[str, int]:  # type: ignore
-        if errors != 'strict':
-            raise IDNAError('Unsupported error handling \"{}\"'.format(errors))
-
-        if not data:
-            return ('', 0)
-
-        labels = _unicode_dots_re.split(data)
-        trailing_dot = ''
-        if labels:
-            if not labels[-1]:
-                trailing_dot = '.'
-                del labels[-1]
-            elif not final:
-                # Keep potentially unfinished label until the next call
-                del labels[-1]
-                if labels:
-                    trailing_dot = '.'
-
-        result = []
-        size = 0
-        for label in labels:
-            result.append(ulabel(label))
-            if size:
-                size += 1
-            size += len(label)
-
-        result_str = '.'.join(result) + trailing_dot
-        size += len(trailing_dot)
-        return (result_str, size)
-
-
-class StreamWriter(Codec, codecs.StreamWriter):
-    pass
-
-
-class StreamReader(Codec, codecs.StreamReader):
-    pass
-
-
-def getregentry() -> codecs.CodecInfo:
-    # Compatibility as a search_function for codecs.register()
-    return codecs.CodecInfo(
-        name='idna',
-        encode=Codec().encode,  # type: ignore
-        decode=Codec().decode,  # type: ignore
-        incrementalencoder=IncrementalEncoder,
-        incrementaldecoder=IncrementalDecoder,
-        streamwriter=StreamWriter,
-        streamreader=StreamReader,
-    )
diff --git a/lib/sub_repos/idna/idna/compat.py b/lib/sub_repos/idna/idna/compat.py
deleted file mode 100644
index 786e6bda6..000000000
--- a/lib/sub_repos/idna/idna/compat.py
+++ /dev/null
@@ -1,13 +0,0 @@
-from .core import *
-from .codec import *
-from typing import Any, Union
-
-def ToASCII(label: str) -> bytes:
-    return encode(label)
-
-def ToUnicode(label: Union[bytes, bytearray]) -> str:
-    return decode(label)
-
-def nameprep(s: Any) -> None:
-    raise NotImplementedError('IDNA 2008 does not utilise nameprep protocol')
-
diff --git a/lib/sub_repos/idna/idna/core.py b/lib/sub_repos/idna/idna/core.py
deleted file mode 100644
index 55ab96788..000000000
--- a/lib/sub_repos/idna/idna/core.py
+++ /dev/null
@@ -1,397 +0,0 @@
-from . import idnadata
-import bisect
-import unicodedata
-import re
-from typing import Union, Optional
-from .intranges import intranges_contain
-
-_virama_combining_class = 9
-_alabel_prefix = b'xn--'
-_unicode_dots_re = re.compile('[\u002e\u3002\uff0e\uff61]')
-
-class IDNAError(UnicodeError):
-    """ Base exception for all IDNA-encoding related problems """
-    pass
-
-
-class IDNABidiError(IDNAError):
-    """ Exception when bidirectional requirements are not satisfied """
-    pass
-
-
-class InvalidCodepoint(IDNAError):
-    """ Exception when a disallowed or unallocated codepoint is used """
-    pass
-
-
-class InvalidCodepointContext(IDNAError):
-    """ Exception when the codepoint is not valid in the context it is used """
-    pass
-
-
-def _combining_class(cp: int) -> int:
-    v = unicodedata.combining(chr(cp))
-    if v == 0:
-        if not unicodedata.name(chr(cp)):
-            raise ValueError('Unknown character in unicodedata')
-    return v
-
-def _is_script(cp: str, script: str) -> bool:
-    return intranges_contain(ord(cp), idnadata.scripts[script])
-
-def _punycode(s: str) -> bytes:
-    return s.encode('punycode')
-
-def _unot(s: int) -> str:
-    return 'U+{:04X}'.format(s)
-
-
-def valid_label_length(label: Union[bytes, str]) -> bool:
-    if len(label) > 63:
-        return False
-    return True
-
-
-def valid_string_length(label: Union[bytes, str], trailing_dot: bool) -> bool:
-    if len(label) > (254 if trailing_dot else 253):
-        return False
-    return True
-
-
-def check_bidi(label: str, check_ltr: bool = False) -> bool:
-    # Bidi rules should only be applied if string contains RTL characters
-    bidi_label = False
-    for (idx, cp) in enumerate(label, 1):
-        direction = unicodedata.bidirectional(cp)
-        if direction == '':
-            # String likely comes from a newer version of Unicode
-            raise IDNABidiError('Unknown directionality in label {} at position {}'.format(repr(label), idx))
-        if direction in ['R', 'AL', 'AN']:
-            bidi_label = True
-    if not bidi_label and not check_ltr:
-        return True
-
-    # Bidi rule 1
-    direction = unicodedata.bidirectional(label[0])
-    if direction in ['R', 'AL']:
-        rtl = True
-    elif direction == 'L':
-        rtl = False
-    else:
-        raise IDNABidiError('First codepoint in label {} must be directionality L, R or AL'.format(repr(label)))
-
-    valid_ending = False
-    number_type = None  # type: Optional[str]
-    for (idx, cp) in enumerate(label, 1):
-        direction = unicodedata.bidirectional(cp)
-
-        if rtl:
-            # Bidi rule 2
-            if not direction in ['R', 'AL', 'AN', 'EN', 'ES', 'CS', 'ET', 'ON', 'BN', 'NSM']:
-                raise IDNABidiError('Invalid direction for codepoint at position {} in a right-to-left label'.format(idx))
-            # Bidi rule 3
-            if direction in ['R', 'AL', 'EN', 'AN']:
-                valid_ending = True
-            elif direction != 'NSM':
-                valid_ending = False
-            # Bidi rule 4
-            if direction in ['AN', 'EN']:
-                if not number_type:
-                    number_type = direction
-                else:
-                    if number_type != direction:
-                        raise IDNABidiError('Can not mix numeral types in a right-to-left label')
-        else:
-            # Bidi rule 5
-            if not direction in ['L', 'EN', 'ES', 'CS', 'ET', 'ON', 'BN', 'NSM']:
-                raise IDNABidiError('Invalid direction for codepoint at position {} in a left-to-right label'.format(idx))
-            # Bidi rule 6
-            if direction in ['L', 'EN']:
-                valid_ending = True
-            elif direction != 'NSM':
-                valid_ending = False
-
-    if not valid_ending:
-        raise IDNABidiError('Label ends with illegal codepoint directionality')
-
-    return True
-
-
-def check_initial_combiner(label: str) -> bool:
-    if unicodedata.category(label[0])[0] == 'M':
-        raise IDNAError('Label begins with an illegal combining character')
-    return True
-
-
-def check_hyphen_ok(label: str) -> bool:
-    if label[2:4] == '--':
-        raise IDNAError('Label has disallowed hyphens in 3rd and 4th position')
-    if label[0] == '-' or label[-1] == '-':
-        raise IDNAError('Label must not start or end with a hyphen')
-    return True
-
-
-def check_nfc(label: str) -> None:
-    if unicodedata.normalize('NFC', label) != label:
-        raise IDNAError('Label must be in Normalization Form C')
-
-
-def valid_contextj(label: str, pos: int) -> bool:
-    cp_value = ord(label[pos])
-
-    if cp_value == 0x200c:
-
-        if pos > 0:
-            if _combining_class(ord(label[pos - 1])) == _virama_combining_class:
-                return True
-
-        ok = False
-        for i in range(pos-1, -1, -1):
-            joining_type = idnadata.joining_types.get(ord(label[i]))
-            if joining_type == ord('T'):
-                continue
-            if joining_type in [ord('L'), ord('D')]:
-                ok = True
-                break
-
-        if not ok:
-            return False
-
-        ok = False
-        for i in range(pos+1, len(label)):
-            joining_type = idnadata.joining_types.get(ord(label[i]))
-            if joining_type == ord('T'):
-                continue
-            if joining_type in [ord('R'), ord('D')]:
-                ok = True
-                break
-        return ok
-
-    if cp_value == 0x200d:
-
-        if pos > 0:
-            if _combining_class(ord(label[pos - 1])) == _virama_combining_class:
-                return True
-        return False
-
-    else:
-
-        return False
-
-
-def valid_contexto(label: str, pos: int, exception: bool = False) -> bool:
-    cp_value = ord(label[pos])
-
-    if cp_value == 0x00b7:
-        if 0 < pos < len(label)-1:
-            if ord(label[pos - 1]) == 0x006c and ord(label[pos + 1]) == 0x006c:
-                return True
-        return False
-
-    elif cp_value == 0x0375:
-        if pos < len(label)-1 and len(label) > 1:
-            return _is_script(label[pos + 1], 'Greek')
-        return False
-
-    elif cp_value == 0x05f3 or cp_value == 0x05f4:
-        if pos > 0:
-            return _is_script(label[pos - 1], 'Hebrew')
-        return False
-
-    elif cp_value == 0x30fb:
-        for cp in label:
-            if cp == '\u30fb':
-                continue
-            if _is_script(cp, 'Hiragana') or _is_script(cp, 'Katakana') or _is_script(cp, 'Han'):
-                return True
-        return False
-
-    elif 0x660 <= cp_value <= 0x669:
-        for cp in label:
-            if 0x6f0 <= ord(cp) <= 0x06f9:
-                return False
-        return True
-
-    elif 0x6f0 <= cp_value <= 0x6f9:
-        for cp in label:
-            if 0x660 <= ord(cp) <= 0x0669:
-                return False
-        return True
-
-    return False
-
-
-def check_label(label: Union[str, bytes, bytearray]) -> None:
-    if isinstance(label, (bytes, bytearray)):
-        label = label.decode('utf-8')
-    if len(label) == 0:
-        raise IDNAError('Empty Label')
-
-    check_nfc(label)
-    check_hyphen_ok(label)
-    check_initial_combiner(label)
-
-    for (pos, cp) in enumerate(label):
-        cp_value = ord(cp)
-        if intranges_contain(cp_value, idnadata.codepoint_classes['PVALID']):
-            continue
-        elif intranges_contain(cp_value, idnadata.codepoint_classes['CONTEXTJ']):
-            try:
-                if not valid_contextj(label, pos):
-                    raise InvalidCodepointContext('Joiner {} not allowed at position {} in {}'.format(
-                        _unot(cp_value), pos+1, repr(label)))
-            except ValueError:
-                raise IDNAError('Unknown codepoint adjacent to joiner {} at position {} in {}'.format(
-                    _unot(cp_value), pos+1, repr(label)))
-        elif intranges_contain(cp_value, idnadata.codepoint_classes['CONTEXTO']):
-            if not valid_contexto(label, pos):
-                raise InvalidCodepointContext('Codepoint {} not allowed at position {} in {}'.format(_unot(cp_value), pos+1, repr(label)))
-        else:
-            raise InvalidCodepoint('Codepoint {} at position {} of {} not allowed'.format(_unot(cp_value), pos+1, repr(label)))
-
-    check_bidi(label)
-
-
-def alabel(label: str) -> bytes:
-    try:
-        label_bytes = label.encode('ascii')
-        ulabel(label_bytes)
-        if not valid_label_length(label_bytes):
-            raise IDNAError('Label too long')
-        return label_bytes
-    except UnicodeEncodeError:
-        pass
-
-    if not label:
-        raise IDNAError('No Input')
-
-    label = str(label)
-    check_label(label)
-    label_bytes = _punycode(label)
-    label_bytes = _alabel_prefix + label_bytes
-
-    if not valid_label_length(label_bytes):
-        raise IDNAError('Label too long')
-
-    return label_bytes
-
-
-def ulabel(label: Union[str, bytes, bytearray]) -> str:
-    if not isinstance(label, (bytes, bytearray)):
-        try:
-            label_bytes = label.encode('ascii')
-        except UnicodeEncodeError:
-            check_label(label)
-            return label
-    else:
-        label_bytes = label
-
-    label_bytes = label_bytes.lower()
-    if label_bytes.startswith(_alabel_prefix):
-        label_bytes = label_bytes[len(_alabel_prefix):]
-        if not label_bytes:
-            raise IDNAError('Malformed A-label, no Punycode eligible content found')
-        if label_bytes.decode('ascii')[-1] == '-':
-            raise IDNAError('A-label must not end with a hyphen')
-    else:
-        check_label(label_bytes)
-        return label_bytes.decode('ascii')
-
-    try:
-        label = label_bytes.decode('punycode')
-    except UnicodeError:
-        raise IDNAError('Invalid A-label')
-    check_label(label)
-    return label
-
-
-def uts46_remap(domain: str, std3_rules: bool = True, transitional: bool = False) -> str:
-    """Re-map the characters in the string according to UTS46 processing."""
-    from .uts46data import uts46data
-    output = ''
-
-    for pos, char in enumerate(domain):
-        code_point = ord(char)
-        try:
-            uts46row = uts46data[code_point if code_point < 256 else
-                bisect.bisect_left(uts46data, (code_point, 'Z')) - 1]
-            status = uts46row[1]
-            replacement = None  # type: Optional[str]
-            if len(uts46row) == 3:
-                replacement = uts46row[2]  # type: ignore
-            if (status == 'V' or
-                    (status == 'D' and not transitional) or
-                    (status == '3' and not std3_rules and replacement is None)):
-                output += char
-            elif replacement is not None and (status == 'M' or
-                    (status == '3' and not std3_rules) or
-                    (status == 'D' and transitional)):
-                output += replacement
-            elif status != 'I':
-                raise IndexError()
-        except IndexError:
-            raise InvalidCodepoint(
-                'Codepoint {} not allowed at position {} in {}'.format(
-                _unot(code_point), pos + 1, repr(domain)))
-
-    return unicodedata.normalize('NFC', output)
-
-
-def encode(s: Union[str, bytes, bytearray], strict: bool = False, uts46: bool = False, std3_rules: bool = False, transitional: bool = False) -> bytes:
-    if isinstance(s, (bytes, bytearray)):
-        s = s.decode('ascii')
-    if uts46:
-        s = uts46_remap(s, std3_rules, transitional)
-    trailing_dot = False
-    result = []
-    if strict:
-        labels = s.split('.')
-    else:
-        labels = _unicode_dots_re.split(s)
-    if not labels or labels == ['']:
-        raise IDNAError('Empty domain')
-    if labels[-1] == '':
-        del labels[-1]
-        trailing_dot = True
-    for label in labels:
-        s = alabel(label)
-        if s:
-            result.append(s)
-        else:
-            raise IDNAError('Empty label')
-    if trailing_dot:
-        result.append(b'')
-    s = b'.'.join(result)
-    if not valid_string_length(s, trailing_dot):
-        raise IDNAError('Domain too long')
-    return s
-
-
-def decode(s: Union[str, bytes, bytearray], strict: bool = False, uts46: bool = False, std3_rules: bool = False) -> str:
-    try:
-        if isinstance(s, (bytes, bytearray)):
-            s = s.decode('ascii')
-    except UnicodeDecodeError:
-        raise IDNAError('Invalid ASCII in A-label')
-    if uts46:
-        s = uts46_remap(s, std3_rules, False)
-    trailing_dot = False
-    result = []
-    if not strict:
-        labels = _unicode_dots_re.split(s)
-    else:
-        labels = s.split('.')
-    if not labels or labels == ['']:
-        raise IDNAError('Empty domain')
-    if not labels[-1]:
-        del labels[-1]
-        trailing_dot = True
-    for label in labels:
-        s = ulabel(label)
-        if s:
-            result.append(s)
-        else:
-            raise IDNAError('Empty label')
-    if trailing_dot:
-        result.append('')
-    return '.'.join(result)
diff --git a/lib/sub_repos/idna/idna/idnadata.py b/lib/sub_repos/idna/idna/idnadata.py
deleted file mode 100644
index 1b5805d15..000000000
--- a/lib/sub_repos/idna/idna/idnadata.py
+++ /dev/null
@@ -1,2137 +0,0 @@
-# This file is automatically generated by tools/idna-data
-
-__version__ = '14.0.0'
-scripts = {
-    'Greek': (
-        0x37000000374,
-        0x37500000378,
-        0x37a0000037e,
-        0x37f00000380,
-        0x38400000385,
-        0x38600000387,
-        0x3880000038b,
-        0x38c0000038d,
-        0x38e000003a2,
-        0x3a3000003e2,
-        0x3f000000400,
-        0x1d2600001d2b,
-        0x1d5d00001d62,
-        0x1d6600001d6b,
-        0x1dbf00001dc0,
-        0x1f0000001f16,
-        0x1f1800001f1e,
-        0x1f2000001f46,
-        0x1f4800001f4e,
-        0x1f5000001f58,
-        0x1f5900001f5a,
-        0x1f5b00001f5c,
-        0x1f5d00001f5e,
-        0x1f5f00001f7e,
-        0x1f8000001fb5,
-        0x1fb600001fc5,
-        0x1fc600001fd4,
-        0x1fd600001fdc,
-        0x1fdd00001ff0,
-        0x1ff200001ff5,
-        0x1ff600001fff,
-        0x212600002127,
-        0xab650000ab66,
-        0x101400001018f,
-        0x101a0000101a1,
-        0x1d2000001d246,
-    ),
-    'Han': (
-        0x2e8000002e9a,
-        0x2e9b00002ef4,
-        0x2f0000002fd6,
-        0x300500003006,
-        0x300700003008,
-        0x30210000302a,
-        0x30380000303c,
-        0x340000004dc0,
-        0x4e000000a000,
-        0xf9000000fa6e,
-        0xfa700000fada,
-        0x16fe200016fe4,
-        0x16ff000016ff2,
-        0x200000002a6e0,
-        0x2a7000002b739,
-        0x2b7400002b81e,
-        0x2b8200002cea2,
-        0x2ceb00002ebe1,
-        0x2f8000002fa1e,
-        0x300000003134b,
-    ),
-    'Hebrew': (
-        0x591000005c8,
-        0x5d0000005eb,
-        0x5ef000005f5,
-        0xfb1d0000fb37,
-        0xfb380000fb3d,
-        0xfb3e0000fb3f,
-        0xfb400000fb42,
-        0xfb430000fb45,
-        0xfb460000fb50,
-    ),
-    'Hiragana': (
-        0x304100003097,
-        0x309d000030a0,
-        0x1b0010001b120,
-        0x1b1500001b153,
-        0x1f2000001f201,
-    ),
-    'Katakana': (
-        0x30a1000030fb,
-        0x30fd00003100,
-        0x31f000003200,
-        0x32d0000032ff,
-        0x330000003358,
-        0xff660000ff70,
-        0xff710000ff9e,
-        0x1aff00001aff4,
-        0x1aff50001affc,
-        0x1affd0001afff,
-        0x1b0000001b001,
-        0x1b1200001b123,
-        0x1b1640001b168,
-    ),
-}
-joining_types = {
-    0x600: 85,
-    0x601: 85,
-    0x602: 85,
-    0x603: 85,
-    0x604: 85,
-    0x605: 85,
-    0x608: 85,
-    0x60b: 85,
-    0x620: 68,
-    0x621: 85,
-    0x622: 82,
-    0x623: 82,
-    0x624: 82,
-    0x625: 82,
-    0x626: 68,
-    0x627: 82,
-    0x628: 68,
-    0x629: 82,
-    0x62a: 68,
-    0x62b: 68,
-    0x62c: 68,
-    0x62d: 68,
-    0x62e: 68,
-    0x62f: 82,
-    0x630: 82,
-    0x631: 82,
-    0x632: 82,
-    0x633: 68,
-    0x634: 68,
-    0x635: 68,
-    0x636: 68,
-    0x637: 68,
-    0x638: 68,
-    0x639: 68,
-    0x63a: 68,
-    0x63b: 68,
-    0x63c: 68,
-    0x63d: 68,
-    0x63e: 68,
-    0x63f: 68,
-    0x640: 67,
-    0x641: 68,
-    0x642: 68,
-    0x643: 68,
-    0x644: 68,
-    0x645: 68,
-    0x646: 68,
-    0x647: 68,
-    0x648: 82,
-    0x649: 68,
-    0x64a: 68,
-    0x66e: 68,
-    0x66f: 68,
-    0x671: 82,
-    0x672: 82,
-    0x673: 82,
-    0x674: 85,
-    0x675: 82,
-    0x676: 82,
-    0x677: 82,
-    0x678: 68,
-    0x679: 68,
-    0x67a: 68,
-    0x67b: 68,
-    0x67c: 68,
-    0x67d: 68,
-    0x67e: 68,
-    0x67f: 68,
-    0x680: 68,
-    0x681: 68,
-    0x682: 68,
-    0x683: 68,
-    0x684: 68,
-    0x685: 68,
-    0x686: 68,
-    0x687: 68,
-    0x688: 82,
-    0x689: 82,
-    0x68a: 82,
-    0x68b: 82,
-    0x68c: 82,
-    0x68d: 82,
-    0x68e: 82,
-    0x68f: 82,
-    0x690: 82,
-    0x691: 82,
-    0x692: 82,
-    0x693: 82,
-    0x694: 82,
-    0x695: 82,
-    0x696: 82,
-    0x697: 82,
-    0x698: 82,
-    0x699: 82,
-    0x69a: 68,
-    0x69b: 68,
-    0x69c: 68,
-    0x69d: 68,
-    0x69e: 68,
-    0x69f: 68,
-    0x6a0: 68,
-    0x6a1: 68,
-    0x6a2: 68,
-    0x6a3: 68,
-    0x6a4: 68,
-    0x6a5: 68,
-    0x6a6: 68,
-    0x6a7: 68,
-    0x6a8: 68,
-    0x6a9: 68,
-    0x6aa: 68,
-    0x6ab: 68,
-    0x6ac: 68,
-    0x6ad: 68,
-    0x6ae: 68,
-    0x6af: 68,
-    0x6b0: 68,
-    0x6b1: 68,
-    0x6b2: 68,
-    0x6b3: 68,
-    0x6b4: 68,
-    0x6b5: 68,
-    0x6b6: 68,
-    0x6b7: 68,
-    0x6b8: 68,
-    0x6b9: 68,
-    0x6ba: 68,
-    0x6bb: 68,
-    0x6bc: 68,
-    0x6bd: 68,
-    0x6be: 68,
-    0x6bf: 68,
-    0x6c0: 82,
-    0x6c1: 68,
-    0x6c2: 68,
-    0x6c3: 82,
-    0x6c4: 82,
-    0x6c5: 82,
-    0x6c6: 82,
-    0x6c7: 82,
-    0x6c8: 82,
-    0x6c9: 82,
-    0x6ca: 82,
-    0x6cb: 82,
-    0x6cc: 68,
-    0x6cd: 82,
-    0x6ce: 68,
-    0x6cf: 82,
-    0x6d0: 68,
-    0x6d1: 68,
-    0x6d2: 82,
-    0x6d3: 82,
-    0x6d5: 82,
-    0x6dd: 85,
-    0x6ee: 82,
-    0x6ef: 82,
-    0x6fa: 68,
-    0x6fb: 68,
-    0x6fc: 68,
-    0x6ff: 68,
-    0x70f: 84,
-    0x710: 82,
-    0x712: 68,
-    0x713: 68,
-    0x714: 68,
-    0x715: 82,
-    0x716: 82,
-    0x717: 82,
-    0x718: 82,
-    0x719: 82,
-    0x71a: 68,
-    0x71b: 68,
-    0x71c: 68,
-    0x71d: 68,
-    0x71e: 82,
-    0x71f: 68,
-    0x720: 68,
-    0x721: 68,
-    0x722: 68,
-    0x723: 68,
-    0x724: 68,
-    0x725: 68,
-    0x726: 68,
-    0x727: 68,
-    0x728: 82,
-    0x729: 68,
-    0x72a: 82,
-    0x72b: 68,
-    0x72c: 82,
-    0x72d: 68,
-    0x72e: 68,
-    0x72f: 82,
-    0x74d: 82,
-    0x74e: 68,
-    0x74f: 68,
-    0x750: 68,
-    0x751: 68,
-    0x752: 68,
-    0x753: 68,
-    0x754: 68,
-    0x755: 68,
-    0x756: 68,
-    0x757: 68,
-    0x758: 68,
-    0x759: 82,
-    0x75a: 82,
-    0x75b: 82,
-    0x75c: 68,
-    0x75d: 68,
-    0x75e: 68,
-    0x75f: 68,
-    0x760: 68,
-    0x761: 68,
-    0x762: 68,
-    0x763: 68,
-    0x764: 68,
-    0x765: 68,
-    0x766: 68,
-    0x767: 68,
-    0x768: 68,
-    0x769: 68,
-    0x76a: 68,
-    0x76b: 82,
-    0x76c: 82,
-    0x76d: 68,
-    0x76e: 68,
-    0x76f: 68,
-    0x770: 68,
-    0x771: 82,
-    0x772: 68,
-    0x773: 82,
-    0x774: 82,
-    0x775: 68,
-    0x776: 68,
-    0x777: 68,
-    0x778: 82,
-    0x779: 82,
-    0x77a: 68,
-    0x77b: 68,
-    0x77c: 68,
-    0x77d: 68,
-    0x77e: 68,
-    0x77f: 68,
-    0x7ca: 68,
-    0x7cb: 68,
-    0x7cc: 68,
-    0x7cd: 68,
-    0x7ce: 68,
-    0x7cf: 68,
-    0x7d0: 68,
-    0x7d1: 68,
-    0x7d2: 68,
-    0x7d3: 68,
-    0x7d4: 68,
-    0x7d5: 68,
-    0x7d6: 68,
-    0x7d7: 68,
-    0x7d8: 68,
-    0x7d9: 68,
-    0x7da: 68,
-    0x7db: 68,
-    0x7dc: 68,
-    0x7dd: 68,
-    0x7de: 68,
-    0x7df: 68,
-    0x7e0: 68,
-    0x7e1: 68,
-    0x7e2: 68,
-    0x7e3: 68,
-    0x7e4: 68,
-    0x7e5: 68,
-    0x7e6: 68,
-    0x7e7: 68,
-    0x7e8: 68,
-    0x7e9: 68,
-    0x7ea: 68,
-    0x7fa: 67,
-    0x840: 82,
-    0x841: 68,
-    0x842: 68,
-    0x843: 68,
-    0x844: 68,
-    0x845: 68,
-    0x846: 82,
-    0x847: 82,
-    0x848: 68,
-    0x849: 82,
-    0x84a: 68,
-    0x84b: 68,
-    0x84c: 68,
-    0x84d: 68,
-    0x84e: 68,
-    0x84f: 68,
-    0x850: 68,
-    0x851: 68,
-    0x852: 68,
-    0x853: 68,
-    0x854: 82,
-    0x855: 68,
-    0x856: 82,
-    0x857: 82,
-    0x858: 82,
-    0x860: 68,
-    0x861: 85,
-    0x862: 68,
-    0x863: 68,
-    0x864: 68,
-    0x865: 68,
-    0x866: 85,
-    0x867: 82,
-    0x868: 68,
-    0x869: 82,
-    0x86a: 82,
-    0x870: 82,
-    0x871: 82,
-    0x872: 82,
-    0x873: 82,
-    0x874: 82,
-    0x875: 82,
-    0x876: 82,
-    0x877: 82,
-    0x878: 82,
-    0x879: 82,
-    0x87a: 82,
-    0x87b: 82,
-    0x87c: 82,
-    0x87d: 82,
-    0x87e: 82,
-    0x87f: 82,
-    0x880: 82,
-    0x881: 82,
-    0x882: 82,
-    0x883: 67,
-    0x884: 67,
-    0x885: 67,
-    0x886: 68,
-    0x887: 85,
-    0x888: 85,
-    0x889: 68,
-    0x88a: 68,
-    0x88b: 68,
-    0x88c: 68,
-    0x88d: 68,
-    0x88e: 82,
-    0x890: 85,
-    0x891: 85,
-    0x8a0: 68,
-    0x8a1: 68,
-    0x8a2: 68,
-    0x8a3: 68,
-    0x8a4: 68,
-    0x8a5: 68,
-    0x8a6: 68,
-    0x8a7: 68,
-    0x8a8: 68,
-    0x8a9: 68,
-    0x8aa: 82,
-    0x8ab: 82,
-    0x8ac: 82,
-    0x8ad: 85,
-    0x8ae: 82,
-    0x8af: 68,
-    0x8b0: 68,
-    0x8b1: 82,
-    0x8b2: 82,
-    0x8b3: 68,
-    0x8b4: 68,
-    0x8b5: 68,
-    0x8b6: 68,
-    0x8b7: 68,
-    0x8b8: 68,
-    0x8b9: 82,
-    0x8ba: 68,
-    0x8bb: 68,
-    0x8bc: 68,
-    0x8bd: 68,
-    0x8be: 68,
-    0x8bf: 68,
-    0x8c0: 68,
-    0x8c1: 68,
-    0x8c2: 68,
-    0x8c3: 68,
-    0x8c4: 68,
-    0x8c5: 68,
-    0x8c6: 68,
-    0x8c7: 68,
-    0x8c8: 68,
-    0x8e2: 85,
-    0x1806: 85,
-    0x1807: 68,
-    0x180a: 67,
-    0x180e: 85,
-    0x1820: 68,
-    0x1821: 68,
-    0x1822: 68,
-    0x1823: 68,
-    0x1824: 68,
-    0x1825: 68,
-    0x1826: 68,
-    0x1827: 68,
-    0x1828: 68,
-    0x1829: 68,
-    0x182a: 68,
-    0x182b: 68,
-    0x182c: 68,
-    0x182d: 68,
-    0x182e: 68,
-    0x182f: 68,
-    0x1830: 68,
-    0x1831: 68,
-    0x1832: 68,
-    0x1833: 68,
-    0x1834: 68,
-    0x1835: 68,
-    0x1836: 68,
-    0x1837: 68,
-    0x1838: 68,
-    0x1839: 68,
-    0x183a: 68,
-    0x183b: 68,
-    0x183c: 68,
-    0x183d: 68,
-    0x183e: 68,
-    0x183f: 68,
-    0x1840: 68,
-    0x1841: 68,
-    0x1842: 68,
-    0x1843: 68,
-    0x1844: 68,
-    0x1845: 68,
-    0x1846: 68,
-    0x1847: 68,
-    0x1848: 68,
-    0x1849: 68,
-    0x184a: 68,
-    0x184b: 68,
-    0x184c: 68,
-    0x184d: 68,
-    0x184e: 68,
-    0x184f: 68,
-    0x1850: 68,
-    0x1851: 68,
-    0x1852: 68,
-    0x1853: 68,
-    0x1854: 68,
-    0x1855: 68,
-    0x1856: 68,
-    0x1857: 68,
-    0x1858: 68,
-    0x1859: 68,
-    0x185a: 68,
-    0x185b: 68,
-    0x185c: 68,
-    0x185d: 68,
-    0x185e: 68,
-    0x185f: 68,
-    0x1860: 68,
-    0x1861: 68,
-    0x1862: 68,
-    0x1863: 68,
-    0x1864: 68,
-    0x1865: 68,
-    0x1866: 68,
-    0x1867: 68,
-    0x1868: 68,
-    0x1869: 68,
-    0x186a: 68,
-    0x186b: 68,
-    0x186c: 68,
-    0x186d: 68,
-    0x186e: 68,
-    0x186f: 68,
-    0x1870: 68,
-    0x1871: 68,
-    0x1872: 68,
-    0x1873: 68,
-    0x1874: 68,
-    0x1875: 68,
-    0x1876: 68,
-    0x1877: 68,
-    0x1878: 68,
-    0x1880: 85,
-    0x1881: 85,
-    0x1882: 85,
-    0x1883: 85,
-    0x1884: 85,
-    0x1885: 84,
-    0x1886: 84,
-    0x1887: 68,
-    0x1888: 68,
-    0x1889: 68,
-    0x188a: 68,
-    0x188b: 68,
-    0x188c: 68,
-    0x188d: 68,
-    0x188e: 68,
-    0x188f: 68,
-    0x1890: 68,
-    0x1891: 68,
-    0x1892: 68,
-    0x1893: 68,
-    0x1894: 68,
-    0x1895: 68,
-    0x1896: 68,
-    0x1897: 68,
-    0x1898: 68,
-    0x1899: 68,
-    0x189a: 68,
-    0x189b: 68,
-    0x189c: 68,
-    0x189d: 68,
-    0x189e: 68,
-    0x189f: 68,
-    0x18a0: 68,
-    0x18a1: 68,
-    0x18a2: 68,
-    0x18a3: 68,
-    0x18a4: 68,
-    0x18a5: 68,
-    0x18a6: 68,
-    0x18a7: 68,
-    0x18a8: 68,
-    0x18aa: 68,
-    0x200c: 85,
-    0x200d: 67,
-    0x202f: 85,
-    0x2066: 85,
-    0x2067: 85,
-    0x2068: 85,
-    0x2069: 85,
-    0xa840: 68,
-    0xa841: 68,
-    0xa842: 68,
-    0xa843: 68,
-    0xa844: 68,
-    0xa845: 68,
-    0xa846: 68,
-    0xa847: 68,
-    0xa848: 68,
-    0xa849: 68,
-    0xa84a: 68,
-    0xa84b: 68,
-    0xa84c: 68,
-    0xa84d: 68,
-    0xa84e: 68,
-    0xa84f: 68,
-    0xa850: 68,
-    0xa851: 68,
-    0xa852: 68,
-    0xa853: 68,
-    0xa854: 68,
-    0xa855: 68,
-    0xa856: 68,
-    0xa857: 68,
-    0xa858: 68,
-    0xa859: 68,
-    0xa85a: 68,
-    0xa85b: 68,
-    0xa85c: 68,
-    0xa85d: 68,
-    0xa85e: 68,
-    0xa85f: 68,
-    0xa860: 68,
-    0xa861: 68,
-    0xa862: 68,
-    0xa863: 68,
-    0xa864: 68,
-    0xa865: 68,
-    0xa866: 68,
-    0xa867: 68,
-    0xa868: 68,
-    0xa869: 68,
-    0xa86a: 68,
-    0xa86b: 68,
-    0xa86c: 68,
-    0xa86d: 68,
-    0xa86e: 68,
-    0xa86f: 68,
-    0xa870: 68,
-    0xa871: 68,
-    0xa872: 76,
-    0xa873: 85,
-    0x10ac0: 68,
-    0x10ac1: 68,
-    0x10ac2: 68,
-    0x10ac3: 68,
-    0x10ac4: 68,
-    0x10ac5: 82,
-    0x10ac6: 85,
-    0x10ac7: 82,
-    0x10ac8: 85,
-    0x10ac9: 82,
-    0x10aca: 82,
-    0x10acb: 85,
-    0x10acc: 85,
-    0x10acd: 76,
-    0x10ace: 82,
-    0x10acf: 82,
-    0x10ad0: 82,
-    0x10ad1: 82,
-    0x10ad2: 82,
-    0x10ad3: 68,
-    0x10ad4: 68,
-    0x10ad5: 68,
-    0x10ad6: 68,
-    0x10ad7: 76,
-    0x10ad8: 68,
-    0x10ad9: 68,
-    0x10ada: 68,
-    0x10adb: 68,
-    0x10adc: 68,
-    0x10add: 82,
-    0x10ade: 68,
-    0x10adf: 68,
-    0x10ae0: 68,
-    0x10ae1: 82,
-    0x10ae2: 85,
-    0x10ae3: 85,
-    0x10ae4: 82,
-    0x10aeb: 68,
-    0x10aec: 68,
-    0x10aed: 68,
-    0x10aee: 68,
-    0x10aef: 82,
-    0x10b80: 68,
-    0x10b81: 82,
-    0x10b82: 68,
-    0x10b83: 82,
-    0x10b84: 82,
-    0x10b85: 82,
-    0x10b86: 68,
-    0x10b87: 68,
-    0x10b88: 68,
-    0x10b89: 82,
-    0x10b8a: 68,
-    0x10b8b: 68,
-    0x10b8c: 82,
-    0x10b8d: 68,
-    0x10b8e: 82,
-    0x10b8f: 82,
-    0x10b90: 68,
-    0x10b91: 82,
-    0x10ba9: 82,
-    0x10baa: 82,
-    0x10bab: 82,
-    0x10bac: 82,
-    0x10bad: 68,
-    0x10bae: 68,
-    0x10baf: 85,
-    0x10d00: 76,
-    0x10d01: 68,
-    0x10d02: 68,
-    0x10d03: 68,
-    0x10d04: 68,
-    0x10d05: 68,
-    0x10d06: 68,
-    0x10d07: 68,
-    0x10d08: 68,
-    0x10d09: 68,
-    0x10d0a: 68,
-    0x10d0b: 68,
-    0x10d0c: 68,
-    0x10d0d: 68,
-    0x10d0e: 68,
-    0x10d0f: 68,
-    0x10d10: 68,
-    0x10d11: 68,
-    0x10d12: 68,
-    0x10d13: 68,
-    0x10d14: 68,
-    0x10d15: 68,
-    0x10d16: 68,
-    0x10d17: 68,
-    0x10d18: 68,
-    0x10d19: 68,
-    0x10d1a: 68,
-    0x10d1b: 68,
-    0x10d1c: 68,
-    0x10d1d: 68,
-    0x10d1e: 68,
-    0x10d1f: 68,
-    0x10d20: 68,
-    0x10d21: 68,
-    0x10d22: 82,
-    0x10d23: 68,
-    0x10f30: 68,
-    0x10f31: 68,
-    0x10f32: 68,
-    0x10f33: 82,
-    0x10f34: 68,
-    0x10f35: 68,
-    0x10f36: 68,
-    0x10f37: 68,
-    0x10f38: 68,
-    0x10f39: 68,
-    0x10f3a: 68,
-    0x10f3b: 68,
-    0x10f3c: 68,
-    0x10f3d: 68,
-    0x10f3e: 68,
-    0x10f3f: 68,
-    0x10f40: 68,
-    0x10f41: 68,
-    0x10f42: 68,
-    0x10f43: 68,
-    0x10f44: 68,
-    0x10f45: 85,
-    0x10f51: 68,
-    0x10f52: 68,
-    0x10f53: 68,
-    0x10f54: 82,
-    0x10f70: 68,
-    0x10f71: 68,
-    0x10f72: 68,
-    0x10f73: 68,
-    0x10f74: 82,
-    0x10f75: 82,
-    0x10f76: 68,
-    0x10f77: 68,
-    0x10f78: 68,
-    0x10f79: 68,
-    0x10f7a: 68,
-    0x10f7b: 68,
-    0x10f7c: 68,
-    0x10f7d: 68,
-    0x10f7e: 68,
-    0x10f7f: 68,
-    0x10f80: 68,
-    0x10f81: 68,
-    0x10fb0: 68,
-    0x10fb1: 85,
-    0x10fb2: 68,
-    0x10fb3: 68,
-    0x10fb4: 82,
-    0x10fb5: 82,
-    0x10fb6: 82,
-    0x10fb7: 85,
-    0x10fb8: 68,
-    0x10fb9: 82,
-    0x10fba: 82,
-    0x10fbb: 68,
-    0x10fbc: 68,
-    0x10fbd: 82,
-    0x10fbe: 68,
-    0x10fbf: 68,
-    0x10fc0: 85,
-    0x10fc1: 68,
-    0x10fc2: 82,
-    0x10fc3: 82,
-    0x10fc4: 68,
-    0x10fc5: 85,
-    0x10fc6: 85,
-    0x10fc7: 85,
-    0x10fc8: 85,
-    0x10fc9: 82,
-    0x10fca: 68,
-    0x10fcb: 76,
-    0x110bd: 85,
-    0x110cd: 85,
-    0x1e900: 68,
-    0x1e901: 68,
-    0x1e902: 68,
-    0x1e903: 68,
-    0x1e904: 68,
-    0x1e905: 68,
-    0x1e906: 68,
-    0x1e907: 68,
-    0x1e908: 68,
-    0x1e909: 68,
-    0x1e90a: 68,
-    0x1e90b: 68,
-    0x1e90c: 68,
-    0x1e90d: 68,
-    0x1e90e: 68,
-    0x1e90f: 68,
-    0x1e910: 68,
-    0x1e911: 68,
-    0x1e912: 68,
-    0x1e913: 68,
-    0x1e914: 68,
-    0x1e915: 68,
-    0x1e916: 68,
-    0x1e917: 68,
-    0x1e918: 68,
-    0x1e919: 68,
-    0x1e91a: 68,
-    0x1e91b: 68,
-    0x1e91c: 68,
-    0x1e91d: 68,
-    0x1e91e: 68,
-    0x1e91f: 68,
-    0x1e920: 68,
-    0x1e921: 68,
-    0x1e922: 68,
-    0x1e923: 68,
-    0x1e924: 68,
-    0x1e925: 68,
-    0x1e926: 68,
-    0x1e927: 68,
-    0x1e928: 68,
-    0x1e929: 68,
-    0x1e92a: 68,
-    0x1e92b: 68,
-    0x1e92c: 68,
-    0x1e92d: 68,
-    0x1e92e: 68,
-    0x1e92f: 68,
-    0x1e930: 68,
-    0x1e931: 68,
-    0x1e932: 68,
-    0x1e933: 68,
-    0x1e934: 68,
-    0x1e935: 68,
-    0x1e936: 68,
-    0x1e937: 68,
-    0x1e938: 68,
-    0x1e939: 68,
-    0x1e93a: 68,
-    0x1e93b: 68,
-    0x1e93c: 68,
-    0x1e93d: 68,
-    0x1e93e: 68,
-    0x1e93f: 68,
-    0x1e940: 68,
-    0x1e941: 68,
-    0x1e942: 68,
-    0x1e943: 68,
-    0x1e94b: 84,
-}
-codepoint_classes = {
-    'PVALID': (
-        0x2d0000002e,
-        0x300000003a,
-        0x610000007b,
-        0xdf000000f7,
-        0xf800000100,
-        0x10100000102,
-        0x10300000104,
-        0x10500000106,
-        0x10700000108,
-        0x1090000010a,
-        0x10b0000010c,
-        0x10d0000010e,
-        0x10f00000110,
-        0x11100000112,
-        0x11300000114,
-        0x11500000116,
-        0x11700000118,
-        0x1190000011a,
-        0x11b0000011c,
-        0x11d0000011e,
-        0x11f00000120,
-        0x12100000122,
-        0x12300000124,
-        0x12500000126,
-        0x12700000128,
-        0x1290000012a,
-        0x12b0000012c,
-        0x12d0000012e,
-        0x12f00000130,
-        0x13100000132,
-        0x13500000136,
-        0x13700000139,
-        0x13a0000013b,
-        0x13c0000013d,
-        0x13e0000013f,
-        0x14200000143,
-        0x14400000145,
-        0x14600000147,
-        0x14800000149,
-        0x14b0000014c,
-        0x14d0000014e,
-        0x14f00000150,
-        0x15100000152,
-        0x15300000154,
-        0x15500000156,
-        0x15700000158,
-        0x1590000015a,
-        0x15b0000015c,
-        0x15d0000015e,
-        0x15f00000160,
-        0x16100000162,
-        0x16300000164,
-        0x16500000166,
-        0x16700000168,
-        0x1690000016a,
-        0x16b0000016c,
-        0x16d0000016e,
-        0x16f00000170,
-        0x17100000172,
-        0x17300000174,
-        0x17500000176,
-        0x17700000178,
-        0x17a0000017b,
-        0x17c0000017d,
-        0x17e0000017f,
-        0x18000000181,
-        0x18300000184,
-        0x18500000186,
-        0x18800000189,
-        0x18c0000018e,
-        0x19200000193,
-        0x19500000196,
-        0x1990000019c,
-        0x19e0000019f,
-        0x1a1000001a2,
-        0x1a3000001a4,
-        0x1a5000001a6,
-        0x1a8000001a9,
-        0x1aa000001ac,
-        0x1ad000001ae,
-        0x1b0000001b1,
-        0x1b4000001b5,
-        0x1b6000001b7,
-        0x1b9000001bc,
-        0x1bd000001c4,
-        0x1ce000001cf,
-        0x1d0000001d1,
-        0x1d2000001d3,
-        0x1d4000001d5,
-        0x1d6000001d7,
-        0x1d8000001d9,
-        0x1da000001db,
-        0x1dc000001de,
-        0x1df000001e0,
-        0x1e1000001e2,
-        0x1e3000001e4,
-        0x1e5000001e6,
-        0x1e7000001e8,
-        0x1e9000001ea,
-        0x1eb000001ec,
-        0x1ed000001ee,
-        0x1ef000001f1,
-        0x1f5000001f6,
-        0x1f9000001fa,
-        0x1fb000001fc,
-        0x1fd000001fe,
-        0x1ff00000200,
-        0x20100000202,
-        0x20300000204,
-        0x20500000206,
-        0x20700000208,
-        0x2090000020a,
-        0x20b0000020c,
-        0x20d0000020e,
-        0x20f00000210,
-        0x21100000212,
-        0x21300000214,
-        0x21500000216,
-        0x21700000218,
-        0x2190000021a,
-        0x21b0000021c,
-        0x21d0000021e,
-        0x21f00000220,
-        0x22100000222,
-        0x22300000224,
-        0x22500000226,
-        0x22700000228,
-        0x2290000022a,
-        0x22b0000022c,
-        0x22d0000022e,
-        0x22f00000230,
-        0x23100000232,
-        0x2330000023a,
-        0x23c0000023d,
-        0x23f00000241,
-        0x24200000243,
-        0x24700000248,
-        0x2490000024a,
-        0x24b0000024c,
-        0x24d0000024e,
-        0x24f000002b0,
-        0x2b9000002c2,
-        0x2c6000002d2,
-        0x2ec000002ed,
-        0x2ee000002ef,
-        0x30000000340,
-        0x34200000343,
-        0x3460000034f,
-        0x35000000370,
-        0x37100000372,
-        0x37300000374,
-        0x37700000378,
-        0x37b0000037e,
-        0x39000000391,
-        0x3ac000003cf,
-        0x3d7000003d8,
-        0x3d9000003da,
-        0x3db000003dc,
-        0x3dd000003de,
-        0x3df000003e0,
-        0x3e1000003e2,
-        0x3e3000003e4,
-        0x3e5000003e6,
-        0x3e7000003e8,
-        0x3e9000003ea,
-        0x3eb000003ec,
-        0x3ed000003ee,
-        0x3ef000003f0,
-        0x3f3000003f4,
-        0x3f8000003f9,
-        0x3fb000003fd,
-        0x43000000460,
-        0x46100000462,
-        0x46300000464,
-        0x46500000466,
-        0x46700000468,
-        0x4690000046a,
-        0x46b0000046c,
-        0x46d0000046e,
-        0x46f00000470,
-        0x47100000472,
-        0x47300000474,
-        0x47500000476,
-        0x47700000478,
-        0x4790000047a,
-        0x47b0000047c,
-        0x47d0000047e,
-        0x47f00000480,
-        0x48100000482,
-        0x48300000488,
-        0x48b0000048c,
-        0x48d0000048e,
-        0x48f00000490,
-        0x49100000492,
-        0x49300000494,
-        0x49500000496,
-        0x49700000498,
-        0x4990000049a,
-        0x49b0000049c,
-        0x49d0000049e,
-        0x49f000004a0,
-        0x4a1000004a2,
-        0x4a3000004a4,
-        0x4a5000004a6,
-        0x4a7000004a8,
-        0x4a9000004aa,
-        0x4ab000004ac,
-        0x4ad000004ae,
-        0x4af000004b0,
-        0x4b1000004b2,
-        0x4b3000004b4,
-        0x4b5000004b6,
-        0x4b7000004b8,
-        0x4b9000004ba,
-        0x4bb000004bc,
-        0x4bd000004be,
-        0x4bf000004c0,
-        0x4c2000004c3,
-        0x4c4000004c5,
-        0x4c6000004c7,
-        0x4c8000004c9,
-        0x4ca000004cb,
-        0x4cc000004cd,
-        0x4ce000004d0,
-        0x4d1000004d2,
-        0x4d3000004d4,
-        0x4d5000004d6,
-        0x4d7000004d8,
-        0x4d9000004da,
-        0x4db000004dc,
-        0x4dd000004de,
-        0x4df000004e0,
-        0x4e1000004e2,
-        0x4e3000004e4,
-        0x4e5000004e6,
-        0x4e7000004e8,
-        0x4e9000004ea,
-        0x4eb000004ec,
-        0x4ed000004ee,
-        0x4ef000004f0,
-        0x4f1000004f2,
-        0x4f3000004f4,
-        0x4f5000004f6,
-        0x4f7000004f8,
-        0x4f9000004fa,
-        0x4fb000004fc,
-        0x4fd000004fe,
-        0x4ff00000500,
-        0x50100000502,
-        0x50300000504,
-        0x50500000506,
-        0x50700000508,
-        0x5090000050a,
-        0x50b0000050c,
-        0x50d0000050e,
-        0x50f00000510,
-        0x51100000512,
-        0x51300000514,
-        0x51500000516,
-        0x51700000518,
-        0x5190000051a,
-        0x51b0000051c,
-        0x51d0000051e,
-        0x51f00000520,
-        0x52100000522,
-        0x52300000524,
-        0x52500000526,
-        0x52700000528,
-        0x5290000052a,
-        0x52b0000052c,
-        0x52d0000052e,
-        0x52f00000530,
-        0x5590000055a,
-        0x56000000587,
-        0x58800000589,
-        0x591000005be,
-        0x5bf000005c0,
-        0x5c1000005c3,
-        0x5c4000005c6,
-        0x5c7000005c8,
-        0x5d0000005eb,
-        0x5ef000005f3,
-        0x6100000061b,
-        0x62000000640,
-        0x64100000660,
-        0x66e00000675,
-        0x679000006d4,
-        0x6d5000006dd,
-        0x6df000006e9,
-        0x6ea000006f0,
-        0x6fa00000700,
-        0x7100000074b,
-        0x74d000007b2,
-        0x7c0000007f6,
-        0x7fd000007fe,
-        0x8000000082e,
-        0x8400000085c,
-        0x8600000086b,
-        0x87000000888,
-        0x8890000088f,
-        0x898000008e2,
-        0x8e300000958,
-        0x96000000964,
-        0x96600000970,
-        0x97100000984,
-        0x9850000098d,
-        0x98f00000991,
-        0x993000009a9,
-        0x9aa000009b1,
-        0x9b2000009b3,
-        0x9b6000009ba,
-        0x9bc000009c5,
-        0x9c7000009c9,
-        0x9cb000009cf,
-        0x9d7000009d8,
-        0x9e0000009e4,
-        0x9e6000009f2,
-        0x9fc000009fd,
-        0x9fe000009ff,
-        0xa0100000a04,
-        0xa0500000a0b,
-        0xa0f00000a11,
-        0xa1300000a29,
-        0xa2a00000a31,
-        0xa3200000a33,
-        0xa3500000a36,
-        0xa3800000a3a,
-        0xa3c00000a3d,
-        0xa3e00000a43,
-        0xa4700000a49,
-        0xa4b00000a4e,
-        0xa5100000a52,
-        0xa5c00000a5d,
-        0xa6600000a76,
-        0xa8100000a84,
-        0xa8500000a8e,
-        0xa8f00000a92,
-        0xa9300000aa9,
-        0xaaa00000ab1,
-        0xab200000ab4,
-        0xab500000aba,
-        0xabc00000ac6,
-        0xac700000aca,
-        0xacb00000ace,
-        0xad000000ad1,
-        0xae000000ae4,
-        0xae600000af0,
-        0xaf900000b00,
-        0xb0100000b04,
-        0xb0500000b0d,
-        0xb0f00000b11,
-        0xb1300000b29,
-        0xb2a00000b31,
-        0xb3200000b34,
-        0xb3500000b3a,
-        0xb3c00000b45,
-        0xb4700000b49,
-        0xb4b00000b4e,
-        0xb5500000b58,
-        0xb5f00000b64,
-        0xb6600000b70,
-        0xb7100000b72,
-        0xb8200000b84,
-        0xb8500000b8b,
-        0xb8e00000b91,
-        0xb9200000b96,
-        0xb9900000b9b,
-        0xb9c00000b9d,
-        0xb9e00000ba0,
-        0xba300000ba5,
-        0xba800000bab,
-        0xbae00000bba,
-        0xbbe00000bc3,
-        0xbc600000bc9,
-        0xbca00000bce,
-        0xbd000000bd1,
-        0xbd700000bd8,
-        0xbe600000bf0,
-        0xc0000000c0d,
-        0xc0e00000c11,
-        0xc1200000c29,
-        0xc2a00000c3a,
-        0xc3c00000c45,
-        0xc4600000c49,
-        0xc4a00000c4e,
-        0xc5500000c57,
-        0xc5800000c5b,
-        0xc5d00000c5e,
-        0xc6000000c64,
-        0xc6600000c70,
-        0xc8000000c84,
-        0xc8500000c8d,
-        0xc8e00000c91,
-        0xc9200000ca9,
-        0xcaa00000cb4,
-        0xcb500000cba,
-        0xcbc00000cc5,
-        0xcc600000cc9,
-        0xcca00000cce,
-        0xcd500000cd7,
-        0xcdd00000cdf,
-        0xce000000ce4,
-        0xce600000cf0,
-        0xcf100000cf3,
-        0xd0000000d0d,
-        0xd0e00000d11,
-        0xd1200000d45,
-        0xd4600000d49,
-        0xd4a00000d4f,
-        0xd5400000d58,
-        0xd5f00000d64,
-        0xd6600000d70,
-        0xd7a00000d80,
-        0xd8100000d84,
-        0xd8500000d97,
-        0xd9a00000db2,
-        0xdb300000dbc,
-        0xdbd00000dbe,
-        0xdc000000dc7,
-        0xdca00000dcb,
-        0xdcf00000dd5,
-        0xdd600000dd7,
-        0xdd800000de0,
-        0xde600000df0,
-        0xdf200000df4,
-        0xe0100000e33,
-        0xe3400000e3b,
-        0xe4000000e4f,
-        0xe5000000e5a,
-        0xe8100000e83,
-        0xe8400000e85,
-        0xe8600000e8b,
-        0xe8c00000ea4,
-        0xea500000ea6,
-        0xea700000eb3,
-        0xeb400000ebe,
-        0xec000000ec5,
-        0xec600000ec7,
-        0xec800000ece,
-        0xed000000eda,
-        0xede00000ee0,
-        0xf0000000f01,
-        0xf0b00000f0c,
-        0xf1800000f1a,
-        0xf2000000f2a,
-        0xf3500000f36,
-        0xf3700000f38,
-        0xf3900000f3a,
-        0xf3e00000f43,
-        0xf4400000f48,
-        0xf4900000f4d,
-        0xf4e00000f52,
-        0xf5300000f57,
-        0xf5800000f5c,
-        0xf5d00000f69,
-        0xf6a00000f6d,
-        0xf7100000f73,
-        0xf7400000f75,
-        0xf7a00000f81,
-        0xf8200000f85,
-        0xf8600000f93,
-        0xf9400000f98,
-        0xf9900000f9d,
-        0xf9e00000fa2,
-        0xfa300000fa7,
-        0xfa800000fac,
-        0xfad00000fb9,
-        0xfba00000fbd,
-        0xfc600000fc7,
-        0x10000000104a,
-        0x10500000109e,
-        0x10d0000010fb,
-        0x10fd00001100,
-        0x120000001249,
-        0x124a0000124e,
-        0x125000001257,
-        0x125800001259,
-        0x125a0000125e,
-        0x126000001289,
-        0x128a0000128e,
-        0x1290000012b1,
-        0x12b2000012b6,
-        0x12b8000012bf,
-        0x12c0000012c1,
-        0x12c2000012c6,
-        0x12c8000012d7,
-        0x12d800001311,
-        0x131200001316,
-        0x13180000135b,
-        0x135d00001360,
-        0x138000001390,
-        0x13a0000013f6,
-        0x14010000166d,
-        0x166f00001680,
-        0x16810000169b,
-        0x16a0000016eb,
-        0x16f1000016f9,
-        0x170000001716,
-        0x171f00001735,
-        0x174000001754,
-        0x17600000176d,
-        0x176e00001771,
-        0x177200001774,
-        0x1780000017b4,
-        0x17b6000017d4,
-        0x17d7000017d8,
-        0x17dc000017de,
-        0x17e0000017ea,
-        0x18100000181a,
-        0x182000001879,
-        0x1880000018ab,
-        0x18b0000018f6,
-        0x19000000191f,
-        0x19200000192c,
-        0x19300000193c,
-        0x19460000196e,
-        0x197000001975,
-        0x1980000019ac,
-        0x19b0000019ca,
-        0x19d0000019da,
-        0x1a0000001a1c,
-        0x1a2000001a5f,
-        0x1a6000001a7d,
-        0x1a7f00001a8a,
-        0x1a9000001a9a,
-        0x1aa700001aa8,
-        0x1ab000001abe,
-        0x1abf00001acf,
-        0x1b0000001b4d,
-        0x1b5000001b5a,
-        0x1b6b00001b74,
-        0x1b8000001bf4,
-        0x1c0000001c38,
-        0x1c4000001c4a,
-        0x1c4d00001c7e,
-        0x1cd000001cd3,
-        0x1cd400001cfb,
-        0x1d0000001d2c,
-        0x1d2f00001d30,
-        0x1d3b00001d3c,
-        0x1d4e00001d4f,
-        0x1d6b00001d78,
-        0x1d7900001d9b,
-        0x1dc000001e00,
-        0x1e0100001e02,
-        0x1e0300001e04,
-        0x1e0500001e06,
-        0x1e0700001e08,
-        0x1e0900001e0a,
-        0x1e0b00001e0c,
-        0x1e0d00001e0e,
-        0x1e0f00001e10,
-        0x1e1100001e12,
-        0x1e1300001e14,
-        0x1e1500001e16,
-        0x1e1700001e18,
-        0x1e1900001e1a,
-        0x1e1b00001e1c,
-        0x1e1d00001e1e,
-        0x1e1f00001e20,
-        0x1e2100001e22,
-        0x1e2300001e24,
-        0x1e2500001e26,
-        0x1e2700001e28,
-        0x1e2900001e2a,
-        0x1e2b00001e2c,
-        0x1e2d00001e2e,
-        0x1e2f00001e30,
-        0x1e3100001e32,
-        0x1e3300001e34,
-        0x1e3500001e36,
-        0x1e3700001e38,
-        0x1e3900001e3a,
-        0x1e3b00001e3c,
-        0x1e3d00001e3e,
-        0x1e3f00001e40,
-        0x1e4100001e42,
-        0x1e4300001e44,
-        0x1e4500001e46,
-        0x1e4700001e48,
-        0x1e4900001e4a,
-        0x1e4b00001e4c,
-        0x1e4d00001e4e,
-        0x1e4f00001e50,
-        0x1e5100001e52,
-        0x1e5300001e54,
-        0x1e5500001e56,
-        0x1e5700001e58,
-        0x1e5900001e5a,
-        0x1e5b00001e5c,
-        0x1e5d00001e5e,
-        0x1e5f00001e60,
-        0x1e6100001e62,
-        0x1e6300001e64,
-        0x1e6500001e66,
-        0x1e6700001e68,
-        0x1e6900001e6a,
-        0x1e6b00001e6c,
-        0x1e6d00001e6e,
-        0x1e6f00001e70,
-        0x1e7100001e72,
-        0x1e7300001e74,
-        0x1e7500001e76,
-        0x1e7700001e78,
-        0x1e7900001e7a,
-        0x1e7b00001e7c,
-        0x1e7d00001e7e,
-        0x1e7f00001e80,
-        0x1e8100001e82,
-        0x1e8300001e84,
-        0x1e8500001e86,
-        0x1e8700001e88,
-        0x1e8900001e8a,
-        0x1e8b00001e8c,
-        0x1e8d00001e8e,
-        0x1e8f00001e90,
-        0x1e9100001e92,
-        0x1e9300001e94,
-        0x1e9500001e9a,
-        0x1e9c00001e9e,
-        0x1e9f00001ea0,
-        0x1ea100001ea2,
-        0x1ea300001ea4,
-        0x1ea500001ea6,
-        0x1ea700001ea8,
-        0x1ea900001eaa,
-        0x1eab00001eac,
-        0x1ead00001eae,
-        0x1eaf00001eb0,
-        0x1eb100001eb2,
-        0x1eb300001eb4,
-        0x1eb500001eb6,
-        0x1eb700001eb8,
-        0x1eb900001eba,
-        0x1ebb00001ebc,
-        0x1ebd00001ebe,
-        0x1ebf00001ec0,
-        0x1ec100001ec2,
-        0x1ec300001ec4,
-        0x1ec500001ec6,
-        0x1ec700001ec8,
-        0x1ec900001eca,
-        0x1ecb00001ecc,
-        0x1ecd00001ece,
-        0x1ecf00001ed0,
-        0x1ed100001ed2,
-        0x1ed300001ed4,
-        0x1ed500001ed6,
-        0x1ed700001ed8,
-        0x1ed900001eda,
-        0x1edb00001edc,
-        0x1edd00001ede,
-        0x1edf00001ee0,
-        0x1ee100001ee2,
-        0x1ee300001ee4,
-        0x1ee500001ee6,
-        0x1ee700001ee8,
-        0x1ee900001eea,
-        0x1eeb00001eec,
-        0x1eed00001eee,
-        0x1eef00001ef0,
-        0x1ef100001ef2,
-        0x1ef300001ef4,
-        0x1ef500001ef6,
-        0x1ef700001ef8,
-        0x1ef900001efa,
-        0x1efb00001efc,
-        0x1efd00001efe,
-        0x1eff00001f08,
-        0x1f1000001f16,
-        0x1f2000001f28,
-        0x1f3000001f38,
-        0x1f4000001f46,
-        0x1f5000001f58,
-        0x1f6000001f68,
-        0x1f7000001f71,
-        0x1f7200001f73,
-        0x1f7400001f75,
-        0x1f7600001f77,
-        0x1f7800001f79,
-        0x1f7a00001f7b,
-        0x1f7c00001f7d,
-        0x1fb000001fb2,
-        0x1fb600001fb7,
-        0x1fc600001fc7,
-        0x1fd000001fd3,
-        0x1fd600001fd8,
-        0x1fe000001fe3,
-        0x1fe400001fe8,
-        0x1ff600001ff7,
-        0x214e0000214f,
-        0x218400002185,
-        0x2c3000002c60,
-        0x2c6100002c62,
-        0x2c6500002c67,
-        0x2c6800002c69,
-        0x2c6a00002c6b,
-        0x2c6c00002c6d,
-        0x2c7100002c72,
-        0x2c7300002c75,
-        0x2c7600002c7c,
-        0x2c8100002c82,
-        0x2c8300002c84,
-        0x2c8500002c86,
-        0x2c8700002c88,
-        0x2c8900002c8a,
-        0x2c8b00002c8c,
-        0x2c8d00002c8e,
-        0x2c8f00002c90,
-        0x2c9100002c92,
-        0x2c9300002c94,
-        0x2c9500002c96,
-        0x2c9700002c98,
-        0x2c9900002c9a,
-        0x2c9b00002c9c,
-        0x2c9d00002c9e,
-        0x2c9f00002ca0,
-        0x2ca100002ca2,
-        0x2ca300002ca4,
-        0x2ca500002ca6,
-        0x2ca700002ca8,
-        0x2ca900002caa,
-        0x2cab00002cac,
-        0x2cad00002cae,
-        0x2caf00002cb0,
-        0x2cb100002cb2,
-        0x2cb300002cb4,
-        0x2cb500002cb6,
-        0x2cb700002cb8,
-        0x2cb900002cba,
-        0x2cbb00002cbc,
-        0x2cbd00002cbe,
-        0x2cbf00002cc0,
-        0x2cc100002cc2,
-        0x2cc300002cc4,
-        0x2cc500002cc6,
-        0x2cc700002cc8,
-        0x2cc900002cca,
-        0x2ccb00002ccc,
-        0x2ccd00002cce,
-        0x2ccf00002cd0,
-        0x2cd100002cd2,
-        0x2cd300002cd4,
-        0x2cd500002cd6,
-        0x2cd700002cd8,
-        0x2cd900002cda,
-        0x2cdb00002cdc,
-        0x2cdd00002cde,
-        0x2cdf00002ce0,
-        0x2ce100002ce2,
-        0x2ce300002ce5,
-        0x2cec00002ced,
-        0x2cee00002cf2,
-        0x2cf300002cf4,
-        0x2d0000002d26,
-        0x2d2700002d28,
-        0x2d2d00002d2e,
-        0x2d3000002d68,
-        0x2d7f00002d97,
-        0x2da000002da7,
-        0x2da800002daf,
-        0x2db000002db7,
-        0x2db800002dbf,
-        0x2dc000002dc7,
-        0x2dc800002dcf,
-        0x2dd000002dd7,
-        0x2dd800002ddf,
-        0x2de000002e00,
-        0x2e2f00002e30,
-        0x300500003008,
-        0x302a0000302e,
-        0x303c0000303d,
-        0x304100003097,
-        0x30990000309b,
-        0x309d0000309f,
-        0x30a1000030fb,
-        0x30fc000030ff,
-        0x310500003130,
-        0x31a0000031c0,
-        0x31f000003200,
-        0x340000004dc0,
-        0x4e000000a48d,
-        0xa4d00000a4fe,
-        0xa5000000a60d,
-        0xa6100000a62c,
-        0xa6410000a642,
-        0xa6430000a644,
-        0xa6450000a646,
-        0xa6470000a648,
-        0xa6490000a64a,
-        0xa64b0000a64c,
-        0xa64d0000a64e,
-        0xa64f0000a650,
-        0xa6510000a652,
-        0xa6530000a654,
-        0xa6550000a656,
-        0xa6570000a658,
-        0xa6590000a65a,
-        0xa65b0000a65c,
-        0xa65d0000a65e,
-        0xa65f0000a660,
-        0xa6610000a662,
-        0xa6630000a664,
-        0xa6650000a666,
-        0xa6670000a668,
-        0xa6690000a66a,
-        0xa66b0000a66c,
-        0xa66d0000a670,
-        0xa6740000a67e,
-        0xa67f0000a680,
-        0xa6810000a682,
-        0xa6830000a684,
-        0xa6850000a686,
-        0xa6870000a688,
-        0xa6890000a68a,
-        0xa68b0000a68c,
-        0xa68d0000a68e,
-        0xa68f0000a690,
-        0xa6910000a692,
-        0xa6930000a694,
-        0xa6950000a696,
-        0xa6970000a698,
-        0xa6990000a69a,
-        0xa69b0000a69c,
-        0xa69e0000a6e6,
-        0xa6f00000a6f2,
-        0xa7170000a720,
-        0xa7230000a724,
-        0xa7250000a726,
-        0xa7270000a728,
-        0xa7290000a72a,
-        0xa72b0000a72c,
-        0xa72d0000a72e,
-        0xa72f0000a732,
-        0xa7330000a734,
-        0xa7350000a736,
-        0xa7370000a738,
-        0xa7390000a73a,
-        0xa73b0000a73c,
-        0xa73d0000a73e,
-        0xa73f0000a740,
-        0xa7410000a742,
-        0xa7430000a744,
-        0xa7450000a746,
-        0xa7470000a748,
-        0xa7490000a74a,
-        0xa74b0000a74c,
-        0xa74d0000a74e,
-        0xa74f0000a750,
-        0xa7510000a752,
-        0xa7530000a754,
-        0xa7550000a756,
-        0xa7570000a758,
-        0xa7590000a75a,
-        0xa75b0000a75c,
-        0xa75d0000a75e,
-        0xa75f0000a760,
-        0xa7610000a762,
-        0xa7630000a764,
-        0xa7650000a766,
-        0xa7670000a768,
-        0xa7690000a76a,
-        0xa76b0000a76c,
-        0xa76d0000a76e,
-        0xa76f0000a770,
-        0xa7710000a779,
-        0xa77a0000a77b,
-        0xa77c0000a77d,
-        0xa77f0000a780,
-        0xa7810000a782,
-        0xa7830000a784,
-        0xa7850000a786,
-        0xa7870000a789,
-        0xa78c0000a78d,
-        0xa78e0000a790,
-        0xa7910000a792,
-        0xa7930000a796,
-        0xa7970000a798,
-        0xa7990000a79a,
-        0xa79b0000a79c,
-        0xa79d0000a79e,
-        0xa79f0000a7a0,
-        0xa7a10000a7a2,
-        0xa7a30000a7a4,
-        0xa7a50000a7a6,
-        0xa7a70000a7a8,
-        0xa7a90000a7aa,
-        0xa7af0000a7b0,
-        0xa7b50000a7b6,
-        0xa7b70000a7b8,
-        0xa7b90000a7ba,
-        0xa7bb0000a7bc,
-        0xa7bd0000a7be,
-        0xa7bf0000a7c0,
-        0xa7c10000a7c2,
-        0xa7c30000a7c4,
-        0xa7c80000a7c9,
-        0xa7ca0000a7cb,
-        0xa7d10000a7d2,
-        0xa7d30000a7d4,
-        0xa7d50000a7d6,
-        0xa7d70000a7d8,
-        0xa7d90000a7da,
-        0xa7f20000a7f5,
-        0xa7f60000a7f8,
-        0xa7fa0000a828,
-        0xa82c0000a82d,
-        0xa8400000a874,
-        0xa8800000a8c6,
-        0xa8d00000a8da,
-        0xa8e00000a8f8,
-        0xa8fb0000a8fc,
-        0xa8fd0000a92e,
-        0xa9300000a954,
-        0xa9800000a9c1,
-        0xa9cf0000a9da,
-        0xa9e00000a9ff,
-        0xaa000000aa37,
-        0xaa400000aa4e,
-        0xaa500000aa5a,
-        0xaa600000aa77,
-        0xaa7a0000aac3,
-        0xaadb0000aade,
-        0xaae00000aaf0,
-        0xaaf20000aaf7,
-        0xab010000ab07,
-        0xab090000ab0f,
-        0xab110000ab17,
-        0xab200000ab27,
-        0xab280000ab2f,
-        0xab300000ab5b,
-        0xab600000ab6a,
-        0xabc00000abeb,
-        0xabec0000abee,
-        0xabf00000abfa,
-        0xac000000d7a4,
-        0xfa0e0000fa10,
-        0xfa110000fa12,
-        0xfa130000fa15,
-        0xfa1f0000fa20,
-        0xfa210000fa22,
-        0xfa230000fa25,
-        0xfa270000fa2a,
-        0xfb1e0000fb1f,
-        0xfe200000fe30,
-        0xfe730000fe74,
-        0x100000001000c,
-        0x1000d00010027,
-        0x100280001003b,
-        0x1003c0001003e,
-        0x1003f0001004e,
-        0x100500001005e,
-        0x10080000100fb,
-        0x101fd000101fe,
-        0x102800001029d,
-        0x102a0000102d1,
-        0x102e0000102e1,
-        0x1030000010320,
-        0x1032d00010341,
-        0x103420001034a,
-        0x103500001037b,
-        0x103800001039e,
-        0x103a0000103c4,
-        0x103c8000103d0,
-        0x104280001049e,
-        0x104a0000104aa,
-        0x104d8000104fc,
-        0x1050000010528,
-        0x1053000010564,
-        0x10597000105a2,
-        0x105a3000105b2,
-        0x105b3000105ba,
-        0x105bb000105bd,
-        0x1060000010737,
-        0x1074000010756,
-        0x1076000010768,
-        0x1078000010786,
-        0x10787000107b1,
-        0x107b2000107bb,
-        0x1080000010806,
-        0x1080800010809,
-        0x1080a00010836,
-        0x1083700010839,
-        0x1083c0001083d,
-        0x1083f00010856,
-        0x1086000010877,
-        0x108800001089f,
-        0x108e0000108f3,
-        0x108f4000108f6,
-        0x1090000010916,
-        0x109200001093a,
-        0x10980000109b8,
-        0x109be000109c0,
-        0x10a0000010a04,
-        0x10a0500010a07,
-        0x10a0c00010a14,
-        0x10a1500010a18,
-        0x10a1900010a36,
-        0x10a3800010a3b,
-        0x10a3f00010a40,
-        0x10a6000010a7d,
-        0x10a8000010a9d,
-        0x10ac000010ac8,
-        0x10ac900010ae7,
-        0x10b0000010b36,
-        0x10b4000010b56,
-        0x10b6000010b73,
-        0x10b8000010b92,
-        0x10c0000010c49,
-        0x10cc000010cf3,
-        0x10d0000010d28,
-        0x10d3000010d3a,
-        0x10e8000010eaa,
-        0x10eab00010ead,
-        0x10eb000010eb2,
-        0x10f0000010f1d,
-        0x10f2700010f28,
-        0x10f3000010f51,
-        0x10f7000010f86,
-        0x10fb000010fc5,
-        0x10fe000010ff7,
-        0x1100000011047,
-        0x1106600011076,
-        0x1107f000110bb,
-        0x110c2000110c3,
-        0x110d0000110e9,
-        0x110f0000110fa,
-        0x1110000011135,
-        0x1113600011140,
-        0x1114400011148,
-        0x1115000011174,
-        0x1117600011177,
-        0x11180000111c5,
-        0x111c9000111cd,
-        0x111ce000111db,
-        0x111dc000111dd,
-        0x1120000011212,
-        0x1121300011238,
-        0x1123e0001123f,
-        0x1128000011287,
-        0x1128800011289,
-        0x1128a0001128e,
-        0x1128f0001129e,
-        0x1129f000112a9,
-        0x112b0000112eb,
-        0x112f0000112fa,
-        0x1130000011304,
-        0x113050001130d,
-        0x1130f00011311,
-        0x1131300011329,
-        0x1132a00011331,
-        0x1133200011334,
-        0x113350001133a,
-        0x1133b00011345,
-        0x1134700011349,
-        0x1134b0001134e,
-        0x1135000011351,
-        0x1135700011358,
-        0x1135d00011364,
-        0x113660001136d,
-        0x1137000011375,
-        0x114000001144b,
-        0x114500001145a,
-        0x1145e00011462,
-        0x11480000114c6,
-        0x114c7000114c8,
-        0x114d0000114da,
-        0x11580000115b6,
-        0x115b8000115c1,
-        0x115d8000115de,
-        0x1160000011641,
-        0x1164400011645,
-        0x116500001165a,
-        0x11680000116b9,
-        0x116c0000116ca,
-        0x117000001171b,
-        0x1171d0001172c,
-        0x117300001173a,
-        0x1174000011747,
-        0x118000001183b,
-        0x118c0000118ea,
-        0x118ff00011907,
-        0x119090001190a,
-        0x1190c00011914,
-        0x1191500011917,
-        0x1191800011936,
-        0x1193700011939,
-        0x1193b00011944,
-        0x119500001195a,
-        0x119a0000119a8,
-        0x119aa000119d8,
-        0x119da000119e2,
-        0x119e3000119e5,
-        0x11a0000011a3f,
-        0x11a4700011a48,
-        0x11a5000011a9a,
-        0x11a9d00011a9e,
-        0x11ab000011af9,
-        0x11c0000011c09,
-        0x11c0a00011c37,
-        0x11c3800011c41,
-        0x11c5000011c5a,
-        0x11c7200011c90,
-        0x11c9200011ca8,
-        0x11ca900011cb7,
-        0x11d0000011d07,
-        0x11d0800011d0a,
-        0x11d0b00011d37,
-        0x11d3a00011d3b,
-        0x11d3c00011d3e,
-        0x11d3f00011d48,
-        0x11d5000011d5a,
-        0x11d6000011d66,
-        0x11d6700011d69,
-        0x11d6a00011d8f,
-        0x11d9000011d92,
-        0x11d9300011d99,
-        0x11da000011daa,
-        0x11ee000011ef7,
-        0x11fb000011fb1,
-        0x120000001239a,
-        0x1248000012544,
-        0x12f9000012ff1,
-        0x130000001342f,
-        0x1440000014647,
-        0x1680000016a39,
-        0x16a4000016a5f,
-        0x16a6000016a6a,
-        0x16a7000016abf,
-        0x16ac000016aca,
-        0x16ad000016aee,
-        0x16af000016af5,
-        0x16b0000016b37,
-        0x16b4000016b44,
-        0x16b5000016b5a,
-        0x16b6300016b78,
-        0x16b7d00016b90,
-        0x16e6000016e80,
-        0x16f0000016f4b,
-        0x16f4f00016f88,
-        0x16f8f00016fa0,
-        0x16fe000016fe2,
-        0x16fe300016fe5,
-        0x16ff000016ff2,
-        0x17000000187f8,
-        0x1880000018cd6,
-        0x18d0000018d09,
-        0x1aff00001aff4,
-        0x1aff50001affc,
-        0x1affd0001afff,
-        0x1b0000001b123,
-        0x1b1500001b153,
-        0x1b1640001b168,
-        0x1b1700001b2fc,
-        0x1bc000001bc6b,
-        0x1bc700001bc7d,
-        0x1bc800001bc89,
-        0x1bc900001bc9a,
-        0x1bc9d0001bc9f,
-        0x1cf000001cf2e,
-        0x1cf300001cf47,
-        0x1da000001da37,
-        0x1da3b0001da6d,
-        0x1da750001da76,
-        0x1da840001da85,
-        0x1da9b0001daa0,
-        0x1daa10001dab0,
-        0x1df000001df1f,
-        0x1e0000001e007,
-        0x1e0080001e019,
-        0x1e01b0001e022,
-        0x1e0230001e025,
-        0x1e0260001e02b,
-        0x1e1000001e12d,
-        0x1e1300001e13e,
-        0x1e1400001e14a,
-        0x1e14e0001e14f,
-        0x1e2900001e2af,
-        0x1e2c00001e2fa,
-        0x1e7e00001e7e7,
-        0x1e7e80001e7ec,
-        0x1e7ed0001e7ef,
-        0x1e7f00001e7ff,
-        0x1e8000001e8c5,
-        0x1e8d00001e8d7,
-        0x1e9220001e94c,
-        0x1e9500001e95a,
-        0x1fbf00001fbfa,
-        0x200000002a6e0,
-        0x2a7000002b739,
-        0x2b7400002b81e,
-        0x2b8200002cea2,
-        0x2ceb00002ebe1,
-        0x300000003134b,
-    ),
-    'CONTEXTJ': (
-        0x200c0000200e,
-    ),
-    'CONTEXTO': (
-        0xb7000000b8,
-        0x37500000376,
-        0x5f3000005f5,
-        0x6600000066a,
-        0x6f0000006fa,
-        0x30fb000030fc,
-    ),
-}
diff --git a/lib/sub_repos/idna/idna/intranges.py b/lib/sub_repos/idna/idna/intranges.py
deleted file mode 100644
index 6a43b0475..000000000
--- a/lib/sub_repos/idna/idna/intranges.py
+++ /dev/null
@@ -1,54 +0,0 @@
-"""
-Given a list of integers, made up of (hopefully) a small number of long runs
-of consecutive integers, compute a representation of the form
-((start1, end1), (start2, end2) ...). Then answer the question "was x present
-in the original list?" in time O(log(# runs)).
-"""
-
-import bisect
-from typing import List, Tuple
-
-def intranges_from_list(list_: List[int]) -> Tuple[int, ...]:
-    """Represent a list of integers as a sequence of ranges:
-    ((start_0, end_0), (start_1, end_1), ...), such that the original
-    integers are exactly those x such that start_i <= x < end_i for some i.
-
-    Ranges are encoded as single integers (start << 32 | end), not as tuples.
-    """
-
-    sorted_list = sorted(list_)
-    ranges = []
-    last_write = -1
-    for i in range(len(sorted_list)):
-        if i+1 < len(sorted_list):
-            if sorted_list[i] == sorted_list[i+1]-1:
-                continue
-        current_range = sorted_list[last_write+1:i+1]
-        ranges.append(_encode_range(current_range[0], current_range[-1] + 1))
-        last_write = i
-
-    return tuple(ranges)
-
-def _encode_range(start: int, end: int) -> int:
-    return (start << 32) | end
-
-def _decode_range(r: int) -> Tuple[int, int]:
-    return (r >> 32), (r & ((1 << 32) - 1))
-
-
-def intranges_contain(int_: int, ranges: Tuple[int, ...]) -> bool:
-    """Determine if `int_` falls into one of the ranges in `ranges`."""
-    tuple_ = _encode_range(int_, 0)
-    pos = bisect.bisect_left(ranges, tuple_)
-    # we could be immediately ahead of a tuple (start, end)
-    # with start < int_ <= end
-    if pos > 0:
-        left, right = _decode_range(ranges[pos-1])
-        if left <= int_ < right:
-            return True
-    # or we could be immediately behind a tuple (int_, end)
-    if pos < len(ranges):
-        left, _ = _decode_range(ranges[pos])
-        if left == int_:
-            return True
-    return False
diff --git a/lib/sub_repos/idna/idna/package_data.py b/lib/sub_repos/idna/idna/package_data.py
deleted file mode 100644
index f5ea87c12..000000000
--- a/lib/sub_repos/idna/idna/package_data.py
+++ /dev/null
@@ -1,2 +0,0 @@
-__version__ = '3.3'
-
diff --git a/lib/sub_repos/idna/idna/py.typed b/lib/sub_repos/idna/idna/py.typed
deleted file mode 100644
index e69de29bb..000000000
diff --git a/lib/sub_repos/idna/idna/uts46data.py b/lib/sub_repos/idna/idna/uts46data.py
deleted file mode 100644
index 8f65705ee..000000000
--- a/lib/sub_repos/idna/idna/uts46data.py
+++ /dev/null
@@ -1,8512 +0,0 @@
-# This file is automatically generated by tools/idna-data
-# vim: set fileencoding=utf-8 :
-
-from typing import List, Tuple, Union
-
-
-"""IDNA Mapping Table from UTS46."""
-
-
-__version__ = '14.0.0'
-def _seg_0() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
-    return [
-    (0x0, '3'),
-    (0x1, '3'),
-    (0x2, '3'),
-    (0x3, '3'),
-    (0x4, '3'),
-    (0x5, '3'),
-    (0x6, '3'),
-    (0x7, '3'),
-    (0x8, '3'),
-    (0x9, '3'),
-    (0xA, '3'),
-    (0xB, '3'),
-    (0xC, '3'),
-    (0xD, '3'),
-    (0xE, '3'),
-    (0xF, '3'),
-    (0x10, '3'),
-    (0x11, '3'),
-    (0x12, '3'),
-    (0x13, '3'),
-    (0x14, '3'),
-    (0x15, '3'),
-    (0x16, '3'),
-    (0x17, '3'),
-    (0x18, '3'),
-    (0x19, '3'),
-    (0x1A, '3'),
-    (0x1B, '3'),
-    (0x1C, '3'),
-    (0x1D, '3'),
-    (0x1E, '3'),
-    (0x1F, '3'),
-    (0x20, '3'),
-    (0x21, '3'),
-    (0x22, '3'),
-    (0x23, '3'),
-    (0x24, '3'),
-    (0x25, '3'),
-    (0x26, '3'),
-    (0x27, '3'),
-    (0x28, '3'),
-    (0x29, '3'),
-    (0x2A, '3'),
-    (0x2B, '3'),
-    (0x2C, '3'),
-    (0x2D, 'V'),
-    (0x2E, 'V'),
-    (0x2F, '3'),
-    (0x30, 'V'),
-    (0x31, 'V'),
-    (0x32, 'V'),
-    (0x33, 'V'),
-    (0x34, 'V'),
-    (0x35, 'V'),
-    (0x36, 'V'),
-    (0x37, 'V'),
-    (0x38, 'V'),
-    (0x39, 'V'),
-    (0x3A, '3'),
-    (0x3B, '3'),
-    (0x3C, '3'),
-    (0x3D, '3'),
-    (0x3E, '3'),
-    (0x3F, '3'),
-    (0x40, '3'),
-    (0x41, 'M', 'a'),
-    (0x42, 'M', 'b'),
-    (0x43, 'M', 'c'),
-    (0x44, 'M', 'd'),
-    (0x45, 'M', 'e'),
-    (0x46, 'M', 'f'),
-    (0x47, 'M', 'g'),
-    (0x48, 'M', 'h'),
-    (0x49, 'M', 'i'),
-    (0x4A, 'M', 'j'),
-    (0x4B, 'M', 'k'),
-    (0x4C, 'M', 'l'),
-    (0x4D, 'M', 'm'),
-    (0x4E, 'M', 'n'),
-    (0x4F, 'M', 'o'),
-    (0x50, 'M', 'p'),
-    (0x51, 'M', 'q'),
-    (0x52, 'M', 'r'),
-    (0x53, 'M', 's'),
-    (0x54, 'M', 't'),
-    (0x55, 'M', 'u'),
-    (0x56, 'M', 'v'),
-    (0x57, 'M', 'w'),
-    (0x58, 'M', 'x'),
-    (0x59, 'M', 'y'),
-    (0x5A, 'M', 'z'),
-    (0x5B, '3'),
-    (0x5C, '3'),
-    (0x5D, '3'),
-    (0x5E, '3'),
-    (0x5F, '3'),
-    (0x60, '3'),
-    (0x61, 'V'),
-    (0x62, 'V'),
-    (0x63, 'V'),
-    ]
-
-def _seg_1() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
-    return [
-    (0x64, 'V'),
-    (0x65, 'V'),
-    (0x66, 'V'),
-    (0x67, 'V'),
-    (0x68, 'V'),
-    (0x69, 'V'),
-    (0x6A, 'V'),
-    (0x6B, 'V'),
-    (0x6C, 'V'),
-    (0x6D, 'V'),
-    (0x6E, 'V'),
-    (0x6F, 'V'),
-    (0x70, 'V'),
-    (0x71, 'V'),
-    (0x72, 'V'),
-    (0x73, 'V'),
-    (0x74, 'V'),
-    (0x75, 'V'),
-    (0x76, 'V'),
-    (0x77, 'V'),
-    (0x78, 'V'),
-    (0x79, 'V'),
-    (0x7A, 'V'),
-    (0x7B, '3'),
-    (0x7C, '3'),
-    (0x7D, '3'),
-    (0x7E, '3'),
-    (0x7F, '3'),
-    (0x80, 'X'),
-    (0x81, 'X'),
-    (0x82, 'X'),
-    (0x83, 'X'),
-    (0x84, 'X'),
-    (0x85, 'X'),
-    (0x86, 'X'),
-    (0x87, 'X'),
-    (0x88, 'X'),
-    (0x89, 'X'),
-    (0x8A, 'X'),
-    (0x8B, 'X'),
-    (0x8C, 'X'),
-    (0x8D, 'X'),
-    (0x8E, 'X'),
-    (0x8F, 'X'),
-    (0x90, 'X'),
-    (0x91, 'X'),
-    (0x92, 'X'),
-    (0x93, 'X'),
-    (0x94, 'X'),
-    (0x95, 'X'),
-    (0x96, 'X'),
-    (0x97, 'X'),
-    (0x98, 'X'),
-    (0x99, 'X'),
-    (0x9A, 'X'),
-    (0x9B, 'X'),
-    (0x9C, 'X'),
-    (0x9D, 'X'),
-    (0x9E, 'X'),
-    (0x9F, 'X'),
-    (0xA0, '3', ' '),
-    (0xA1, 'V'),
-    (0xA2, 'V'),
-    (0xA3, 'V'),
-    (0xA4, 'V'),
-    (0xA5, 'V'),
-    (0xA6, 'V'),
-    (0xA7, 'V'),
-    (0xA8, '3', ' ̈'),
-    (0xA9, 'V'),
-    (0xAA, 'M', 'a'),
-    (0xAB, 'V'),
-    (0xAC, 'V'),
-    (0xAD, 'I'),
-    (0xAE, 'V'),
-    (0xAF, '3', ' Ì„'),
-    (0xB0, 'V'),
-    (0xB1, 'V'),
-    (0xB2, 'M', '2'),
-    (0xB3, 'M', '3'),
-    (0xB4, '3', ' Ì'),
-    (0xB5, 'M', 'μ'),
-    (0xB6, 'V'),
-    (0xB7, 'V'),
-    (0xB8, '3', ' ̧'),
-    (0xB9, 'M', '1'),
-    (0xBA, 'M', 'o'),
-    (0xBB, 'V'),
-    (0xBC, 'M', '1â„4'),
-    (0xBD, 'M', '1â„2'),
-    (0xBE, 'M', '3â„4'),
-    (0xBF, 'V'),
-    (0xC0, 'M', 'à'),
-    (0xC1, 'M', 'á'),
-    (0xC2, 'M', 'â'),
-    (0xC3, 'M', 'ã'),
-    (0xC4, 'M', 'ä'),
-    (0xC5, 'M', 'Ã¥'),
-    (0xC6, 'M', 'æ'),
-    (0xC7, 'M', 'ç'),
-    ]
-
-def _seg_2() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
-    return [
-    (0xC8, 'M', 'è'),
-    (0xC9, 'M', 'é'),
-    (0xCA, 'M', 'ê'),
-    (0xCB, 'M', 'ë'),
-    (0xCC, 'M', 'ì'),
-    (0xCD, 'M', 'í'),
-    (0xCE, 'M', 'î'),
-    (0xCF, 'M', 'ï'),
-    (0xD0, 'M', 'ð'),
-    (0xD1, 'M', 'ñ'),
-    (0xD2, 'M', 'ò'),
-    (0xD3, 'M', 'ó'),
-    (0xD4, 'M', 'ô'),
-    (0xD5, 'M', 'õ'),
-    (0xD6, 'M', 'ö'),
-    (0xD7, 'V'),
-    (0xD8, 'M', 'ø'),
-    (0xD9, 'M', 'ù'),
-    (0xDA, 'M', 'ú'),
-    (0xDB, 'M', 'û'),
-    (0xDC, 'M', 'ü'),
-    (0xDD, 'M', 'ý'),
-    (0xDE, 'M', 'þ'),
-    (0xDF, 'D', 'ss'),
-    (0xE0, 'V'),
-    (0xE1, 'V'),
-    (0xE2, 'V'),
-    (0xE3, 'V'),
-    (0xE4, 'V'),
-    (0xE5, 'V'),
-    (0xE6, 'V'),
-    (0xE7, 'V'),
-    (0xE8, 'V'),
-    (0xE9, 'V'),
-    (0xEA, 'V'),
-    (0xEB, 'V'),
-    (0xEC, 'V'),
-    (0xED, 'V'),
-    (0xEE, 'V'),
-    (0xEF, 'V'),
-    (0xF0, 'V'),
-    (0xF1, 'V'),
-    (0xF2, 'V'),
-    (0xF3, 'V'),
-    (0xF4, 'V'),
-    (0xF5, 'V'),
-    (0xF6, 'V'),
-    (0xF7, 'V'),
-    (0xF8, 'V'),
-    (0xF9, 'V'),
-    (0xFA, 'V'),
-    (0xFB, 'V'),
-    (0xFC, 'V'),
-    (0xFD, 'V'),
-    (0xFE, 'V'),
-    (0xFF, 'V'),
-    (0x100, 'M', 'Ä'),
-    (0x101, 'V'),
-    (0x102, 'M', 'ă'),
-    (0x103, 'V'),
-    (0x104, 'M', 'Ä…'),
-    (0x105, 'V'),
-    (0x106, 'M', 'ć'),
-    (0x107, 'V'),
-    (0x108, 'M', 'ĉ'),
-    (0x109, 'V'),
-    (0x10A, 'M', 'Ä‹'),
-    (0x10B, 'V'),
-    (0x10C, 'M', 'Ä'),
-    (0x10D, 'V'),
-    (0x10E, 'M', 'Ä'),
-    (0x10F, 'V'),
-    (0x110, 'M', 'Ä‘'),
-    (0x111, 'V'),
-    (0x112, 'M', 'Ä“'),
-    (0x113, 'V'),
-    (0x114, 'M', 'Ä•'),
-    (0x115, 'V'),
-    (0x116, 'M', 'Ä—'),
-    (0x117, 'V'),
-    (0x118, 'M', 'Ä™'),
-    (0x119, 'V'),
-    (0x11A, 'M', 'Ä›'),
-    (0x11B, 'V'),
-    (0x11C, 'M', 'Ä'),
-    (0x11D, 'V'),
-    (0x11E, 'M', 'ÄŸ'),
-    (0x11F, 'V'),
-    (0x120, 'M', 'Ä¡'),
-    (0x121, 'V'),
-    (0x122, 'M', 'Ä£'),
-    (0x123, 'V'),
-    (0x124, 'M', 'Ä¥'),
-    (0x125, 'V'),
-    (0x126, 'M', 'ħ'),
-    (0x127, 'V'),
-    (0x128, 'M', 'Ä©'),
-    (0x129, 'V'),
-    (0x12A, 'M', 'Ä«'),
-    (0x12B, 'V'),
-    ]
-
-def _seg_3() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
-    return [
-    (0x12C, 'M', 'Ä­'),
-    (0x12D, 'V'),
-    (0x12E, 'M', 'į'),
-    (0x12F, 'V'),
-    (0x130, 'M', 'i̇'),
-    (0x131, 'V'),
-    (0x132, 'M', 'ij'),
-    (0x134, 'M', 'ĵ'),
-    (0x135, 'V'),
-    (0x136, 'M', 'Ä·'),
-    (0x137, 'V'),
-    (0x139, 'M', 'ĺ'),
-    (0x13A, 'V'),
-    (0x13B, 'M', 'ļ'),
-    (0x13C, 'V'),
-    (0x13D, 'M', 'ľ'),
-    (0x13E, 'V'),
-    (0x13F, 'M', 'l·'),
-    (0x141, 'M', 'Å‚'),
-    (0x142, 'V'),
-    (0x143, 'M', 'Å„'),
-    (0x144, 'V'),
-    (0x145, 'M', 'ņ'),
-    (0x146, 'V'),
-    (0x147, 'M', 'ň'),
-    (0x148, 'V'),
-    (0x149, 'M', 'ʼn'),
-    (0x14A, 'M', 'Å‹'),
-    (0x14B, 'V'),
-    (0x14C, 'M', 'Å'),
-    (0x14D, 'V'),
-    (0x14E, 'M', 'Å'),
-    (0x14F, 'V'),
-    (0x150, 'M', 'Å‘'),
-    (0x151, 'V'),
-    (0x152, 'M', 'Å“'),
-    (0x153, 'V'),
-    (0x154, 'M', 'Å•'),
-    (0x155, 'V'),
-    (0x156, 'M', 'Å—'),
-    (0x157, 'V'),
-    (0x158, 'M', 'Å™'),
-    (0x159, 'V'),
-    (0x15A, 'M', 'Å›'),
-    (0x15B, 'V'),
-    (0x15C, 'M', 'Å'),
-    (0x15D, 'V'),
-    (0x15E, 'M', 'ÅŸ'),
-    (0x15F, 'V'),
-    (0x160, 'M', 'Å¡'),
-    (0x161, 'V'),
-    (0x162, 'M', 'Å£'),
-    (0x163, 'V'),
-    (0x164, 'M', 'Å¥'),
-    (0x165, 'V'),
-    (0x166, 'M', 'ŧ'),
-    (0x167, 'V'),
-    (0x168, 'M', 'Å©'),
-    (0x169, 'V'),
-    (0x16A, 'M', 'Å«'),
-    (0x16B, 'V'),
-    (0x16C, 'M', 'Å­'),
-    (0x16D, 'V'),
-    (0x16E, 'M', 'ů'),
-    (0x16F, 'V'),
-    (0x170, 'M', 'ű'),
-    (0x171, 'V'),
-    (0x172, 'M', 'ų'),
-    (0x173, 'V'),
-    (0x174, 'M', 'ŵ'),
-    (0x175, 'V'),
-    (0x176, 'M', 'Å·'),
-    (0x177, 'V'),
-    (0x178, 'M', 'ÿ'),
-    (0x179, 'M', 'ź'),
-    (0x17A, 'V'),
-    (0x17B, 'M', 'ż'),
-    (0x17C, 'V'),
-    (0x17D, 'M', 'ž'),
-    (0x17E, 'V'),
-    (0x17F, 'M', 's'),
-    (0x180, 'V'),
-    (0x181, 'M', 'É“'),
-    (0x182, 'M', 'ƃ'),
-    (0x183, 'V'),
-    (0x184, 'M', 'Æ…'),
-    (0x185, 'V'),
-    (0x186, 'M', 'É”'),
-    (0x187, 'M', 'ƈ'),
-    (0x188, 'V'),
-    (0x189, 'M', 'É–'),
-    (0x18A, 'M', 'É—'),
-    (0x18B, 'M', 'ƌ'),
-    (0x18C, 'V'),
-    (0x18E, 'M', 'Ç'),
-    (0x18F, 'M', 'É™'),
-    (0x190, 'M', 'É›'),
-    (0x191, 'M', 'Æ’'),
-    (0x192, 'V'),
-    (0x193, 'M', 'É '),
-    ]
-
-def _seg_4() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
-    return [
-    (0x194, 'M', 'É£'),
-    (0x195, 'V'),
-    (0x196, 'M', 'É©'),
-    (0x197, 'M', 'ɨ'),
-    (0x198, 'M', 'Æ™'),
-    (0x199, 'V'),
-    (0x19C, 'M', 'ɯ'),
-    (0x19D, 'M', 'ɲ'),
-    (0x19E, 'V'),
-    (0x19F, 'M', 'ɵ'),
-    (0x1A0, 'M', 'Æ¡'),
-    (0x1A1, 'V'),
-    (0x1A2, 'M', 'Æ£'),
-    (0x1A3, 'V'),
-    (0x1A4, 'M', 'Æ¥'),
-    (0x1A5, 'V'),
-    (0x1A6, 'M', 'Ê€'),
-    (0x1A7, 'M', 'ƨ'),
-    (0x1A8, 'V'),
-    (0x1A9, 'M', 'ʃ'),
-    (0x1AA, 'V'),
-    (0x1AC, 'M', 'Æ­'),
-    (0x1AD, 'V'),
-    (0x1AE, 'M', 'ʈ'),
-    (0x1AF, 'M', 'ư'),
-    (0x1B0, 'V'),
-    (0x1B1, 'M', 'ÊŠ'),
-    (0x1B2, 'M', 'Ê‹'),
-    (0x1B3, 'M', 'Æ´'),
-    (0x1B4, 'V'),
-    (0x1B5, 'M', 'ƶ'),
-    (0x1B6, 'V'),
-    (0x1B7, 'M', 'Ê’'),
-    (0x1B8, 'M', 'ƹ'),
-    (0x1B9, 'V'),
-    (0x1BC, 'M', 'ƽ'),
-    (0x1BD, 'V'),
-    (0x1C4, 'M', 'dž'),
-    (0x1C7, 'M', 'lj'),
-    (0x1CA, 'M', 'nj'),
-    (0x1CD, 'M', 'ÇŽ'),
-    (0x1CE, 'V'),
-    (0x1CF, 'M', 'Ç'),
-    (0x1D0, 'V'),
-    (0x1D1, 'M', 'Ç’'),
-    (0x1D2, 'V'),
-    (0x1D3, 'M', 'Ç”'),
-    (0x1D4, 'V'),
-    (0x1D5, 'M', 'Ç–'),
-    (0x1D6, 'V'),
-    (0x1D7, 'M', 'ǘ'),
-    (0x1D8, 'V'),
-    (0x1D9, 'M', 'Çš'),
-    (0x1DA, 'V'),
-    (0x1DB, 'M', 'ǜ'),
-    (0x1DC, 'V'),
-    (0x1DE, 'M', 'ÇŸ'),
-    (0x1DF, 'V'),
-    (0x1E0, 'M', 'Ç¡'),
-    (0x1E1, 'V'),
-    (0x1E2, 'M', 'Ç£'),
-    (0x1E3, 'V'),
-    (0x1E4, 'M', 'Ç¥'),
-    (0x1E5, 'V'),
-    (0x1E6, 'M', 'ǧ'),
-    (0x1E7, 'V'),
-    (0x1E8, 'M', 'Ç©'),
-    (0x1E9, 'V'),
-    (0x1EA, 'M', 'Ç«'),
-    (0x1EB, 'V'),
-    (0x1EC, 'M', 'Ç­'),
-    (0x1ED, 'V'),
-    (0x1EE, 'M', 'ǯ'),
-    (0x1EF, 'V'),
-    (0x1F1, 'M', 'dz'),
-    (0x1F4, 'M', 'ǵ'),
-    (0x1F5, 'V'),
-    (0x1F6, 'M', 'Æ•'),
-    (0x1F7, 'M', 'Æ¿'),
-    (0x1F8, 'M', 'ǹ'),
-    (0x1F9, 'V'),
-    (0x1FA, 'M', 'Ç»'),
-    (0x1FB, 'V'),
-    (0x1FC, 'M', 'ǽ'),
-    (0x1FD, 'V'),
-    (0x1FE, 'M', 'Ç¿'),
-    (0x1FF, 'V'),
-    (0x200, 'M', 'È'),
-    (0x201, 'V'),
-    (0x202, 'M', 'ȃ'),
-    (0x203, 'V'),
-    (0x204, 'M', 'È…'),
-    (0x205, 'V'),
-    (0x206, 'M', 'ȇ'),
-    (0x207, 'V'),
-    (0x208, 'M', 'ȉ'),
-    (0x209, 'V'),
-    (0x20A, 'M', 'È‹'),
-    (0x20B, 'V'),
-    (0x20C, 'M', 'È'),
-    ]
-
-def _seg_5() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
-    return [
-    (0x20D, 'V'),
-    (0x20E, 'M', 'È'),
-    (0x20F, 'V'),
-    (0x210, 'M', 'È‘'),
-    (0x211, 'V'),
-    (0x212, 'M', 'È“'),
-    (0x213, 'V'),
-    (0x214, 'M', 'È•'),
-    (0x215, 'V'),
-    (0x216, 'M', 'È—'),
-    (0x217, 'V'),
-    (0x218, 'M', 'È™'),
-    (0x219, 'V'),
-    (0x21A, 'M', 'È›'),
-    (0x21B, 'V'),
-    (0x21C, 'M', 'È'),
-    (0x21D, 'V'),
-    (0x21E, 'M', 'ÈŸ'),
-    (0x21F, 'V'),
-    (0x220, 'M', 'Æž'),
-    (0x221, 'V'),
-    (0x222, 'M', 'È£'),
-    (0x223, 'V'),
-    (0x224, 'M', 'È¥'),
-    (0x225, 'V'),
-    (0x226, 'M', 'ȧ'),
-    (0x227, 'V'),
-    (0x228, 'M', 'È©'),
-    (0x229, 'V'),
-    (0x22A, 'M', 'È«'),
-    (0x22B, 'V'),
-    (0x22C, 'M', 'È­'),
-    (0x22D, 'V'),
-    (0x22E, 'M', 'ȯ'),
-    (0x22F, 'V'),
-    (0x230, 'M', 'ȱ'),
-    (0x231, 'V'),
-    (0x232, 'M', 'ȳ'),
-    (0x233, 'V'),
-    (0x23A, 'M', 'â±¥'),
-    (0x23B, 'M', 'ȼ'),
-    (0x23C, 'V'),
-    (0x23D, 'M', 'Æš'),
-    (0x23E, 'M', 'ⱦ'),
-    (0x23F, 'V'),
-    (0x241, 'M', 'É‚'),
-    (0x242, 'V'),
-    (0x243, 'M', 'Æ€'),
-    (0x244, 'M', 'ʉ'),
-    (0x245, 'M', 'ʌ'),
-    (0x246, 'M', 'ɇ'),
-    (0x247, 'V'),
-    (0x248, 'M', 'ɉ'),
-    (0x249, 'V'),
-    (0x24A, 'M', 'É‹'),
-    (0x24B, 'V'),
-    (0x24C, 'M', 'É'),
-    (0x24D, 'V'),
-    (0x24E, 'M', 'É'),
-    (0x24F, 'V'),
-    (0x2B0, 'M', 'h'),
-    (0x2B1, 'M', 'ɦ'),
-    (0x2B2, 'M', 'j'),
-    (0x2B3, 'M', 'r'),
-    (0x2B4, 'M', 'ɹ'),
-    (0x2B5, 'M', 'É»'),
-    (0x2B6, 'M', 'Ê'),
-    (0x2B7, 'M', 'w'),
-    (0x2B8, 'M', 'y'),
-    (0x2B9, 'V'),
-    (0x2D8, '3', ' ̆'),
-    (0x2D9, '3', ' ̇'),
-    (0x2DA, '3', ' ÌŠ'),
-    (0x2DB, '3', ' ̨'),
-    (0x2DC, '3', ' ̃'),
-    (0x2DD, '3', ' Ì‹'),
-    (0x2DE, 'V'),
-    (0x2E0, 'M', 'É£'),
-    (0x2E1, 'M', 'l'),
-    (0x2E2, 'M', 's'),
-    (0x2E3, 'M', 'x'),
-    (0x2E4, 'M', 'Ê•'),
-    (0x2E5, 'V'),
-    (0x340, 'M', 'Ì€'),
-    (0x341, 'M', 'Ì'),
-    (0x342, 'V'),
-    (0x343, 'M', 'Ì“'),
-    (0x344, 'M', '̈Ì'),
-    (0x345, 'M', 'ι'),
-    (0x346, 'V'),
-    (0x34F, 'I'),
-    (0x350, 'V'),
-    (0x370, 'M', 'ͱ'),
-    (0x371, 'V'),
-    (0x372, 'M', 'ͳ'),
-    (0x373, 'V'),
-    (0x374, 'M', 'ʹ'),
-    (0x375, 'V'),
-    (0x376, 'M', 'Í·'),
-    (0x377, 'V'),
-    ]
-
-def _seg_6() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
-    return [
-    (0x378, 'X'),
-    (0x37A, '3', ' ι'),
-    (0x37B, 'V'),
-    (0x37E, '3', ';'),
-    (0x37F, 'M', 'ϳ'),
-    (0x380, 'X'),
-    (0x384, '3', ' Ì'),
-    (0x385, '3', ' ̈Ì'),
-    (0x386, 'M', 'ά'),
-    (0x387, 'M', '·'),
-    (0x388, 'M', 'έ'),
-    (0x389, 'M', 'ή'),
-    (0x38A, 'M', 'ί'),
-    (0x38B, 'X'),
-    (0x38C, 'M', 'ό'),
-    (0x38D, 'X'),
-    (0x38E, 'M', 'Ï'),
-    (0x38F, 'M', 'ÏŽ'),
-    (0x390, 'V'),
-    (0x391, 'M', 'α'),
-    (0x392, 'M', 'β'),
-    (0x393, 'M', 'γ'),
-    (0x394, 'M', 'δ'),
-    (0x395, 'M', 'ε'),
-    (0x396, 'M', 'ζ'),
-    (0x397, 'M', 'η'),
-    (0x398, 'M', 'θ'),
-    (0x399, 'M', 'ι'),
-    (0x39A, 'M', 'κ'),
-    (0x39B, 'M', 'λ'),
-    (0x39C, 'M', 'μ'),
-    (0x39D, 'M', 'ν'),
-    (0x39E, 'M', 'ξ'),
-    (0x39F, 'M', 'ο'),
-    (0x3A0, 'M', 'Ï€'),
-    (0x3A1, 'M', 'Ï'),
-    (0x3A2, 'X'),
-    (0x3A3, 'M', 'σ'),
-    (0x3A4, 'M', 'Ï„'),
-    (0x3A5, 'M', 'Ï…'),
-    (0x3A6, 'M', 'φ'),
-    (0x3A7, 'M', 'χ'),
-    (0x3A8, 'M', 'ψ'),
-    (0x3A9, 'M', 'ω'),
-    (0x3AA, 'M', 'ÏŠ'),
-    (0x3AB, 'M', 'Ï‹'),
-    (0x3AC, 'V'),
-    (0x3C2, 'D', 'σ'),
-    (0x3C3, 'V'),
-    (0x3CF, 'M', 'Ï—'),
-    (0x3D0, 'M', 'β'),
-    (0x3D1, 'M', 'θ'),
-    (0x3D2, 'M', 'Ï…'),
-    (0x3D3, 'M', 'Ï'),
-    (0x3D4, 'M', 'Ï‹'),
-    (0x3D5, 'M', 'φ'),
-    (0x3D6, 'M', 'Ï€'),
-    (0x3D7, 'V'),
-    (0x3D8, 'M', 'Ï™'),
-    (0x3D9, 'V'),
-    (0x3DA, 'M', 'Ï›'),
-    (0x3DB, 'V'),
-    (0x3DC, 'M', 'Ï'),
-    (0x3DD, 'V'),
-    (0x3DE, 'M', 'ÏŸ'),
-    (0x3DF, 'V'),
-    (0x3E0, 'M', 'Ï¡'),
-    (0x3E1, 'V'),
-    (0x3E2, 'M', 'Ï£'),
-    (0x3E3, 'V'),
-    (0x3E4, 'M', 'Ï¥'),
-    (0x3E5, 'V'),
-    (0x3E6, 'M', 'ϧ'),
-    (0x3E7, 'V'),
-    (0x3E8, 'M', 'Ï©'),
-    (0x3E9, 'V'),
-    (0x3EA, 'M', 'Ï«'),
-    (0x3EB, 'V'),
-    (0x3EC, 'M', 'Ï­'),
-    (0x3ED, 'V'),
-    (0x3EE, 'M', 'ϯ'),
-    (0x3EF, 'V'),
-    (0x3F0, 'M', 'κ'),
-    (0x3F1, 'M', 'Ï'),
-    (0x3F2, 'M', 'σ'),
-    (0x3F3, 'V'),
-    (0x3F4, 'M', 'θ'),
-    (0x3F5, 'M', 'ε'),
-    (0x3F6, 'V'),
-    (0x3F7, 'M', 'ϸ'),
-    (0x3F8, 'V'),
-    (0x3F9, 'M', 'σ'),
-    (0x3FA, 'M', 'Ï»'),
-    (0x3FB, 'V'),
-    (0x3FD, 'M', 'Í»'),
-    (0x3FE, 'M', 'ͼ'),
-    (0x3FF, 'M', 'ͽ'),
-    (0x400, 'M', 'Ñ'),
-    (0x401, 'M', 'Ñ‘'),
-    (0x402, 'M', 'Ñ’'),
-    ]
-
-def _seg_7() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
-    return [
-    (0x403, 'M', 'Ñ“'),
-    (0x404, 'M', 'Ñ”'),
-    (0x405, 'M', 'Ñ•'),
-    (0x406, 'M', 'Ñ–'),
-    (0x407, 'M', 'Ñ—'),
-    (0x408, 'M', 'ј'),
-    (0x409, 'M', 'Ñ™'),
-    (0x40A, 'M', 'Ñš'),
-    (0x40B, 'M', 'Ñ›'),
-    (0x40C, 'M', 'ќ'),
-    (0x40D, 'M', 'Ñ'),
-    (0x40E, 'M', 'Ñž'),
-    (0x40F, 'M', 'ÑŸ'),
-    (0x410, 'M', 'а'),
-    (0x411, 'M', 'б'),
-    (0x412, 'M', 'в'),
-    (0x413, 'M', 'г'),
-    (0x414, 'M', 'д'),
-    (0x415, 'M', 'е'),
-    (0x416, 'M', 'ж'),
-    (0x417, 'M', 'з'),
-    (0x418, 'M', 'и'),
-    (0x419, 'M', 'й'),
-    (0x41A, 'M', 'к'),
-    (0x41B, 'M', 'л'),
-    (0x41C, 'M', 'м'),
-    (0x41D, 'M', 'н'),
-    (0x41E, 'M', 'о'),
-    (0x41F, 'M', 'п'),
-    (0x420, 'M', 'Ñ€'),
-    (0x421, 'M', 'Ñ'),
-    (0x422, 'M', 'Ñ‚'),
-    (0x423, 'M', 'у'),
-    (0x424, 'M', 'Ñ„'),
-    (0x425, 'M', 'Ñ…'),
-    (0x426, 'M', 'ц'),
-    (0x427, 'M', 'ч'),
-    (0x428, 'M', 'ш'),
-    (0x429, 'M', 'щ'),
-    (0x42A, 'M', 'ÑŠ'),
-    (0x42B, 'M', 'Ñ‹'),
-    (0x42C, 'M', 'ь'),
-    (0x42D, 'M', 'Ñ'),
-    (0x42E, 'M', 'ÑŽ'),
-    (0x42F, 'M', 'Ñ'),
-    (0x430, 'V'),
-    (0x460, 'M', 'Ñ¡'),
-    (0x461, 'V'),
-    (0x462, 'M', 'Ñ£'),
-    (0x463, 'V'),
-    (0x464, 'M', 'Ñ¥'),
-    (0x465, 'V'),
-    (0x466, 'M', 'ѧ'),
-    (0x467, 'V'),
-    (0x468, 'M', 'Ñ©'),
-    (0x469, 'V'),
-    (0x46A, 'M', 'Ñ«'),
-    (0x46B, 'V'),
-    (0x46C, 'M', 'Ñ­'),
-    (0x46D, 'V'),
-    (0x46E, 'M', 'ѯ'),
-    (0x46F, 'V'),
-    (0x470, 'M', 'ѱ'),
-    (0x471, 'V'),
-    (0x472, 'M', 'ѳ'),
-    (0x473, 'V'),
-    (0x474, 'M', 'ѵ'),
-    (0x475, 'V'),
-    (0x476, 'M', 'Ñ·'),
-    (0x477, 'V'),
-    (0x478, 'M', 'ѹ'),
-    (0x479, 'V'),
-    (0x47A, 'M', 'Ñ»'),
-    (0x47B, 'V'),
-    (0x47C, 'M', 'ѽ'),
-    (0x47D, 'V'),
-    (0x47E, 'M', 'Ñ¿'),
-    (0x47F, 'V'),
-    (0x480, 'M', 'Ò'),
-    (0x481, 'V'),
-    (0x48A, 'M', 'Ò‹'),
-    (0x48B, 'V'),
-    (0x48C, 'M', 'Ò'),
-    (0x48D, 'V'),
-    (0x48E, 'M', 'Ò'),
-    (0x48F, 'V'),
-    (0x490, 'M', 'Ò‘'),
-    (0x491, 'V'),
-    (0x492, 'M', 'Ò“'),
-    (0x493, 'V'),
-    (0x494, 'M', 'Ò•'),
-    (0x495, 'V'),
-    (0x496, 'M', 'Ò—'),
-    (0x497, 'V'),
-    (0x498, 'M', 'Ò™'),
-    (0x499, 'V'),
-    (0x49A, 'M', 'Ò›'),
-    (0x49B, 'V'),
-    (0x49C, 'M', 'Ò'),
-    (0x49D, 'V'),
-    ]
-
-def _seg_8() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
-    return [
-    (0x49E, 'M', 'ÒŸ'),
-    (0x49F, 'V'),
-    (0x4A0, 'M', 'Ò¡'),
-    (0x4A1, 'V'),
-    (0x4A2, 'M', 'Ò£'),
-    (0x4A3, 'V'),
-    (0x4A4, 'M', 'Ò¥'),
-    (0x4A5, 'V'),
-    (0x4A6, 'M', 'Ò§'),
-    (0x4A7, 'V'),
-    (0x4A8, 'M', 'Ò©'),
-    (0x4A9, 'V'),
-    (0x4AA, 'M', 'Ò«'),
-    (0x4AB, 'V'),
-    (0x4AC, 'M', 'Ò­'),
-    (0x4AD, 'V'),
-    (0x4AE, 'M', 'Ò¯'),
-    (0x4AF, 'V'),
-    (0x4B0, 'M', 'Ò±'),
-    (0x4B1, 'V'),
-    (0x4B2, 'M', 'Ò³'),
-    (0x4B3, 'V'),
-    (0x4B4, 'M', 'Òµ'),
-    (0x4B5, 'V'),
-    (0x4B6, 'M', 'Ò·'),
-    (0x4B7, 'V'),
-    (0x4B8, 'M', 'Ò¹'),
-    (0x4B9, 'V'),
-    (0x4BA, 'M', 'Ò»'),
-    (0x4BB, 'V'),
-    (0x4BC, 'M', 'Ò½'),
-    (0x4BD, 'V'),
-    (0x4BE, 'M', 'Ò¿'),
-    (0x4BF, 'V'),
-    (0x4C0, 'X'),
-    (0x4C1, 'M', 'Ó‚'),
-    (0x4C2, 'V'),
-    (0x4C3, 'M', 'Ó„'),
-    (0x4C4, 'V'),
-    (0x4C5, 'M', 'Ó†'),
-    (0x4C6, 'V'),
-    (0x4C7, 'M', 'Óˆ'),
-    (0x4C8, 'V'),
-    (0x4C9, 'M', 'ÓŠ'),
-    (0x4CA, 'V'),
-    (0x4CB, 'M', 'ӌ'),
-    (0x4CC, 'V'),
-    (0x4CD, 'M', 'ÓŽ'),
-    (0x4CE, 'V'),
-    (0x4D0, 'M', 'Ó‘'),
-    (0x4D1, 'V'),
-    (0x4D2, 'M', 'Ó“'),
-    (0x4D3, 'V'),
-    (0x4D4, 'M', 'Ó•'),
-    (0x4D5, 'V'),
-    (0x4D6, 'M', 'Ó—'),
-    (0x4D7, 'V'),
-    (0x4D8, 'M', 'Ó™'),
-    (0x4D9, 'V'),
-    (0x4DA, 'M', 'Ó›'),
-    (0x4DB, 'V'),
-    (0x4DC, 'M', 'Ó'),
-    (0x4DD, 'V'),
-    (0x4DE, 'M', 'ÓŸ'),
-    (0x4DF, 'V'),
-    (0x4E0, 'M', 'Ó¡'),
-    (0x4E1, 'V'),
-    (0x4E2, 'M', 'Ó£'),
-    (0x4E3, 'V'),
-    (0x4E4, 'M', 'Ó¥'),
-    (0x4E5, 'V'),
-    (0x4E6, 'M', 'Ó§'),
-    (0x4E7, 'V'),
-    (0x4E8, 'M', 'Ó©'),
-    (0x4E9, 'V'),
-    (0x4EA, 'M', 'Ó«'),
-    (0x4EB, 'V'),
-    (0x4EC, 'M', 'Ó­'),
-    (0x4ED, 'V'),
-    (0x4EE, 'M', 'Ó¯'),
-    (0x4EF, 'V'),
-    (0x4F0, 'M', 'Ó±'),
-    (0x4F1, 'V'),
-    (0x4F2, 'M', 'Ó³'),
-    (0x4F3, 'V'),
-    (0x4F4, 'M', 'Óµ'),
-    (0x4F5, 'V'),
-    (0x4F6, 'M', 'Ó·'),
-    (0x4F7, 'V'),
-    (0x4F8, 'M', 'Ó¹'),
-    (0x4F9, 'V'),
-    (0x4FA, 'M', 'Ó»'),
-    (0x4FB, 'V'),
-    (0x4FC, 'M', 'Ó½'),
-    (0x4FD, 'V'),
-    (0x4FE, 'M', 'Ó¿'),
-    (0x4FF, 'V'),
-    (0x500, 'M', 'Ô'),
-    (0x501, 'V'),
-    (0x502, 'M', 'Ôƒ'),
-    ]
-
-def _seg_9() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
-    return [
-    (0x503, 'V'),
-    (0x504, 'M', 'Ô…'),
-    (0x505, 'V'),
-    (0x506, 'M', 'Ô‡'),
-    (0x507, 'V'),
-    (0x508, 'M', 'Ô‰'),
-    (0x509, 'V'),
-    (0x50A, 'M', 'Ô‹'),
-    (0x50B, 'V'),
-    (0x50C, 'M', 'Ô'),
-    (0x50D, 'V'),
-    (0x50E, 'M', 'Ô'),
-    (0x50F, 'V'),
-    (0x510, 'M', 'Ô‘'),
-    (0x511, 'V'),
-    (0x512, 'M', 'Ô“'),
-    (0x513, 'V'),
-    (0x514, 'M', 'Ô•'),
-    (0x515, 'V'),
-    (0x516, 'M', 'Ô—'),
-    (0x517, 'V'),
-    (0x518, 'M', 'Ô™'),
-    (0x519, 'V'),
-    (0x51A, 'M', 'Ô›'),
-    (0x51B, 'V'),
-    (0x51C, 'M', 'Ô'),
-    (0x51D, 'V'),
-    (0x51E, 'M', 'ÔŸ'),
-    (0x51F, 'V'),
-    (0x520, 'M', 'Ô¡'),
-    (0x521, 'V'),
-    (0x522, 'M', 'Ô£'),
-    (0x523, 'V'),
-    (0x524, 'M', 'Ô¥'),
-    (0x525, 'V'),
-    (0x526, 'M', 'Ô§'),
-    (0x527, 'V'),
-    (0x528, 'M', 'Ô©'),
-    (0x529, 'V'),
-    (0x52A, 'M', 'Ô«'),
-    (0x52B, 'V'),
-    (0x52C, 'M', 'Ô­'),
-    (0x52D, 'V'),
-    (0x52E, 'M', 'Ô¯'),
-    (0x52F, 'V'),
-    (0x530, 'X'),
-    (0x531, 'M', 'Õ¡'),
-    (0x532, 'M', 'Õ¢'),
-    (0x533, 'M', 'Õ£'),
-    (0x534, 'M', 'Õ¤'),
-    (0x535, 'M', 'Õ¥'),
-    (0x536, 'M', 'Õ¦'),
-    (0x537, 'M', 'Õ§'),
-    (0x538, 'M', 'Õ¨'),
-    (0x539, 'M', 'Õ©'),
-    (0x53A, 'M', 'Õª'),
-    (0x53B, 'M', 'Õ«'),
-    (0x53C, 'M', 'Õ¬'),
-    (0x53D, 'M', 'Õ­'),
-    (0x53E, 'M', 'Õ®'),
-    (0x53F, 'M', 'Õ¯'),
-    (0x540, 'M', 'Õ°'),
-    (0x541, 'M', 'Õ±'),
-    (0x542, 'M', 'Õ²'),
-    (0x543, 'M', 'Õ³'),
-    (0x544, 'M', 'Õ´'),
-    (0x545, 'M', 'Õµ'),
-    (0x546, 'M', 'Õ¶'),
-    (0x547, 'M', 'Õ·'),
-    (0x548, 'M', 'Õ¸'),
-    (0x549, 'M', 'Õ¹'),
-    (0x54A, 'M', 'Õº'),
-    (0x54B, 'M', 'Õ»'),
-    (0x54C, 'M', 'Õ¼'),
-    (0x54D, 'M', 'Õ½'),
-    (0x54E, 'M', 'Õ¾'),
-    (0x54F, 'M', 'Õ¿'),
-    (0x550, 'M', 'Ö€'),
-    (0x551, 'M', 'Ö'),
-    (0x552, 'M', 'Ö‚'),
-    (0x553, 'M', 'Öƒ'),
-    (0x554, 'M', 'Ö„'),
-    (0x555, 'M', 'Ö…'),
-    (0x556, 'M', 'Ö†'),
-    (0x557, 'X'),
-    (0x559, 'V'),
-    (0x587, 'M', 'Õ¥Ö‚'),
-    (0x588, 'V'),
-    (0x58B, 'X'),
-    (0x58D, 'V'),
-    (0x590, 'X'),
-    (0x591, 'V'),
-    (0x5C8, 'X'),
-    (0x5D0, 'V'),
-    (0x5EB, 'X'),
-    (0x5EF, 'V'),
-    (0x5F5, 'X'),
-    (0x606, 'V'),
-    (0x61C, 'X'),
-    (0x61D, 'V'),
-    ]
-
-def _seg_10() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
-    return [
-    (0x675, 'M', 'اٴ'),
-    (0x676, 'M', 'وٴ'),
-    (0x677, 'M', 'Û‡Ù´'),
-    (0x678, 'M', 'يٴ'),
-    (0x679, 'V'),
-    (0x6DD, 'X'),
-    (0x6DE, 'V'),
-    (0x70E, 'X'),
-    (0x710, 'V'),
-    (0x74B, 'X'),
-    (0x74D, 'V'),
-    (0x7B2, 'X'),
-    (0x7C0, 'V'),
-    (0x7FB, 'X'),
-    (0x7FD, 'V'),
-    (0x82E, 'X'),
-    (0x830, 'V'),
-    (0x83F, 'X'),
-    (0x840, 'V'),
-    (0x85C, 'X'),
-    (0x85E, 'V'),
-    (0x85F, 'X'),
-    (0x860, 'V'),
-    (0x86B, 'X'),
-    (0x870, 'V'),
-    (0x88F, 'X'),
-    (0x898, 'V'),
-    (0x8E2, 'X'),
-    (0x8E3, 'V'),
-    (0x958, 'M', 'क़'),
-    (0x959, 'M', 'ख़'),
-    (0x95A, 'M', 'ग़'),
-    (0x95B, 'M', 'ज़'),
-    (0x95C, 'M', 'ड़'),
-    (0x95D, 'M', 'ढ़'),
-    (0x95E, 'M', 'फ़'),
-    (0x95F, 'M', 'य़'),
-    (0x960, 'V'),
-    (0x984, 'X'),
-    (0x985, 'V'),
-    (0x98D, 'X'),
-    (0x98F, 'V'),
-    (0x991, 'X'),
-    (0x993, 'V'),
-    (0x9A9, 'X'),
-    (0x9AA, 'V'),
-    (0x9B1, 'X'),
-    (0x9B2, 'V'),
-    (0x9B3, 'X'),
-    (0x9B6, 'V'),
-    (0x9BA, 'X'),
-    (0x9BC, 'V'),
-    (0x9C5, 'X'),
-    (0x9C7, 'V'),
-    (0x9C9, 'X'),
-    (0x9CB, 'V'),
-    (0x9CF, 'X'),
-    (0x9D7, 'V'),
-    (0x9D8, 'X'),
-    (0x9DC, 'M', 'ড়'),
-    (0x9DD, 'M', 'ঢ়'),
-    (0x9DE, 'X'),
-    (0x9DF, 'M', 'য়'),
-    (0x9E0, 'V'),
-    (0x9E4, 'X'),
-    (0x9E6, 'V'),
-    (0x9FF, 'X'),
-    (0xA01, 'V'),
-    (0xA04, 'X'),
-    (0xA05, 'V'),
-    (0xA0B, 'X'),
-    (0xA0F, 'V'),
-    (0xA11, 'X'),
-    (0xA13, 'V'),
-    (0xA29, 'X'),
-    (0xA2A, 'V'),
-    (0xA31, 'X'),
-    (0xA32, 'V'),
-    (0xA33, 'M', 'ਲ਼'),
-    (0xA34, 'X'),
-    (0xA35, 'V'),
-    (0xA36, 'M', 'ਸ਼'),
-    (0xA37, 'X'),
-    (0xA38, 'V'),
-    (0xA3A, 'X'),
-    (0xA3C, 'V'),
-    (0xA3D, 'X'),
-    (0xA3E, 'V'),
-    (0xA43, 'X'),
-    (0xA47, 'V'),
-    (0xA49, 'X'),
-    (0xA4B, 'V'),
-    (0xA4E, 'X'),
-    (0xA51, 'V'),
-    (0xA52, 'X'),
-    (0xA59, 'M', 'ਖ਼'),
-    (0xA5A, 'M', 'ਗ਼'),
-    (0xA5B, 'M', 'ਜ਼'),
-    (0xA5C, 'V'),
-    (0xA5D, 'X'),
-    ]
-
-def _seg_11() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
-    return [
-    (0xA5E, 'M', 'ਫ਼'),
-    (0xA5F, 'X'),
-    (0xA66, 'V'),
-    (0xA77, 'X'),
-    (0xA81, 'V'),
-    (0xA84, 'X'),
-    (0xA85, 'V'),
-    (0xA8E, 'X'),
-    (0xA8F, 'V'),
-    (0xA92, 'X'),
-    (0xA93, 'V'),
-    (0xAA9, 'X'),
-    (0xAAA, 'V'),
-    (0xAB1, 'X'),
-    (0xAB2, 'V'),
-    (0xAB4, 'X'),
-    (0xAB5, 'V'),
-    (0xABA, 'X'),
-    (0xABC, 'V'),
-    (0xAC6, 'X'),
-    (0xAC7, 'V'),
-    (0xACA, 'X'),
-    (0xACB, 'V'),
-    (0xACE, 'X'),
-    (0xAD0, 'V'),
-    (0xAD1, 'X'),
-    (0xAE0, 'V'),
-    (0xAE4, 'X'),
-    (0xAE6, 'V'),
-    (0xAF2, 'X'),
-    (0xAF9, 'V'),
-    (0xB00, 'X'),
-    (0xB01, 'V'),
-    (0xB04, 'X'),
-    (0xB05, 'V'),
-    (0xB0D, 'X'),
-    (0xB0F, 'V'),
-    (0xB11, 'X'),
-    (0xB13, 'V'),
-    (0xB29, 'X'),
-    (0xB2A, 'V'),
-    (0xB31, 'X'),
-    (0xB32, 'V'),
-    (0xB34, 'X'),
-    (0xB35, 'V'),
-    (0xB3A, 'X'),
-    (0xB3C, 'V'),
-    (0xB45, 'X'),
-    (0xB47, 'V'),
-    (0xB49, 'X'),
-    (0xB4B, 'V'),
-    (0xB4E, 'X'),
-    (0xB55, 'V'),
-    (0xB58, 'X'),
-    (0xB5C, 'M', 'ଡ଼'),
-    (0xB5D, 'M', 'ଢ଼'),
-    (0xB5E, 'X'),
-    (0xB5F, 'V'),
-    (0xB64, 'X'),
-    (0xB66, 'V'),
-    (0xB78, 'X'),
-    (0xB82, 'V'),
-    (0xB84, 'X'),
-    (0xB85, 'V'),
-    (0xB8B, 'X'),
-    (0xB8E, 'V'),
-    (0xB91, 'X'),
-    (0xB92, 'V'),
-    (0xB96, 'X'),
-    (0xB99, 'V'),
-    (0xB9B, 'X'),
-    (0xB9C, 'V'),
-    (0xB9D, 'X'),
-    (0xB9E, 'V'),
-    (0xBA0, 'X'),
-    (0xBA3, 'V'),
-    (0xBA5, 'X'),
-    (0xBA8, 'V'),
-    (0xBAB, 'X'),
-    (0xBAE, 'V'),
-    (0xBBA, 'X'),
-    (0xBBE, 'V'),
-    (0xBC3, 'X'),
-    (0xBC6, 'V'),
-    (0xBC9, 'X'),
-    (0xBCA, 'V'),
-    (0xBCE, 'X'),
-    (0xBD0, 'V'),
-    (0xBD1, 'X'),
-    (0xBD7, 'V'),
-    (0xBD8, 'X'),
-    (0xBE6, 'V'),
-    (0xBFB, 'X'),
-    (0xC00, 'V'),
-    (0xC0D, 'X'),
-    (0xC0E, 'V'),
-    (0xC11, 'X'),
-    (0xC12, 'V'),
-    (0xC29, 'X'),
-    (0xC2A, 'V'),
-    ]
-
-def _seg_12() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
-    return [
-    (0xC3A, 'X'),
-    (0xC3C, 'V'),
-    (0xC45, 'X'),
-    (0xC46, 'V'),
-    (0xC49, 'X'),
-    (0xC4A, 'V'),
-    (0xC4E, 'X'),
-    (0xC55, 'V'),
-    (0xC57, 'X'),
-    (0xC58, 'V'),
-    (0xC5B, 'X'),
-    (0xC5D, 'V'),
-    (0xC5E, 'X'),
-    (0xC60, 'V'),
-    (0xC64, 'X'),
-    (0xC66, 'V'),
-    (0xC70, 'X'),
-    (0xC77, 'V'),
-    (0xC8D, 'X'),
-    (0xC8E, 'V'),
-    (0xC91, 'X'),
-    (0xC92, 'V'),
-    (0xCA9, 'X'),
-    (0xCAA, 'V'),
-    (0xCB4, 'X'),
-    (0xCB5, 'V'),
-    (0xCBA, 'X'),
-    (0xCBC, 'V'),
-    (0xCC5, 'X'),
-    (0xCC6, 'V'),
-    (0xCC9, 'X'),
-    (0xCCA, 'V'),
-    (0xCCE, 'X'),
-    (0xCD5, 'V'),
-    (0xCD7, 'X'),
-    (0xCDD, 'V'),
-    (0xCDF, 'X'),
-    (0xCE0, 'V'),
-    (0xCE4, 'X'),
-    (0xCE6, 'V'),
-    (0xCF0, 'X'),
-    (0xCF1, 'V'),
-    (0xCF3, 'X'),
-    (0xD00, 'V'),
-    (0xD0D, 'X'),
-    (0xD0E, 'V'),
-    (0xD11, 'X'),
-    (0xD12, 'V'),
-    (0xD45, 'X'),
-    (0xD46, 'V'),
-    (0xD49, 'X'),
-    (0xD4A, 'V'),
-    (0xD50, 'X'),
-    (0xD54, 'V'),
-    (0xD64, 'X'),
-    (0xD66, 'V'),
-    (0xD80, 'X'),
-    (0xD81, 'V'),
-    (0xD84, 'X'),
-    (0xD85, 'V'),
-    (0xD97, 'X'),
-    (0xD9A, 'V'),
-    (0xDB2, 'X'),
-    (0xDB3, 'V'),
-    (0xDBC, 'X'),
-    (0xDBD, 'V'),
-    (0xDBE, 'X'),
-    (0xDC0, 'V'),
-    (0xDC7, 'X'),
-    (0xDCA, 'V'),
-    (0xDCB, 'X'),
-    (0xDCF, 'V'),
-    (0xDD5, 'X'),
-    (0xDD6, 'V'),
-    (0xDD7, 'X'),
-    (0xDD8, 'V'),
-    (0xDE0, 'X'),
-    (0xDE6, 'V'),
-    (0xDF0, 'X'),
-    (0xDF2, 'V'),
-    (0xDF5, 'X'),
-    (0xE01, 'V'),
-    (0xE33, 'M', 'à¹à¸²'),
-    (0xE34, 'V'),
-    (0xE3B, 'X'),
-    (0xE3F, 'V'),
-    (0xE5C, 'X'),
-    (0xE81, 'V'),
-    (0xE83, 'X'),
-    (0xE84, 'V'),
-    (0xE85, 'X'),
-    (0xE86, 'V'),
-    (0xE8B, 'X'),
-    (0xE8C, 'V'),
-    (0xEA4, 'X'),
-    (0xEA5, 'V'),
-    (0xEA6, 'X'),
-    (0xEA7, 'V'),
-    (0xEB3, 'M', 'à»àº²'),
-    (0xEB4, 'V'),
-    ]
-
-def _seg_13() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
-    return [
-    (0xEBE, 'X'),
-    (0xEC0, 'V'),
-    (0xEC5, 'X'),
-    (0xEC6, 'V'),
-    (0xEC7, 'X'),
-    (0xEC8, 'V'),
-    (0xECE, 'X'),
-    (0xED0, 'V'),
-    (0xEDA, 'X'),
-    (0xEDC, 'M', 'ຫນ'),
-    (0xEDD, 'M', 'ຫມ'),
-    (0xEDE, 'V'),
-    (0xEE0, 'X'),
-    (0xF00, 'V'),
-    (0xF0C, 'M', '་'),
-    (0xF0D, 'V'),
-    (0xF43, 'M', 'གྷ'),
-    (0xF44, 'V'),
-    (0xF48, 'X'),
-    (0xF49, 'V'),
-    (0xF4D, 'M', 'ཌྷ'),
-    (0xF4E, 'V'),
-    (0xF52, 'M', 'དྷ'),
-    (0xF53, 'V'),
-    (0xF57, 'M', 'བྷ'),
-    (0xF58, 'V'),
-    (0xF5C, 'M', 'ཛྷ'),
-    (0xF5D, 'V'),
-    (0xF69, 'M', 'ཀྵ'),
-    (0xF6A, 'V'),
-    (0xF6D, 'X'),
-    (0xF71, 'V'),
-    (0xF73, 'M', 'ཱི'),
-    (0xF74, 'V'),
-    (0xF75, 'M', 'ཱུ'),
-    (0xF76, 'M', 'ྲྀ'),
-    (0xF77, 'M', 'ྲཱྀ'),
-    (0xF78, 'M', 'ླྀ'),
-    (0xF79, 'M', 'ླཱྀ'),
-    (0xF7A, 'V'),
-    (0xF81, 'M', 'ཱྀ'),
-    (0xF82, 'V'),
-    (0xF93, 'M', 'ྒྷ'),
-    (0xF94, 'V'),
-    (0xF98, 'X'),
-    (0xF99, 'V'),
-    (0xF9D, 'M', 'ྜྷ'),
-    (0xF9E, 'V'),
-    (0xFA2, 'M', 'ྡྷ'),
-    (0xFA3, 'V'),
-    (0xFA7, 'M', 'ྦྷ'),
-    (0xFA8, 'V'),
-    (0xFAC, 'M', 'ྫྷ'),
-    (0xFAD, 'V'),
-    (0xFB9, 'M', 'à¾à¾µ'),
-    (0xFBA, 'V'),
-    (0xFBD, 'X'),
-    (0xFBE, 'V'),
-    (0xFCD, 'X'),
-    (0xFCE, 'V'),
-    (0xFDB, 'X'),
-    (0x1000, 'V'),
-    (0x10A0, 'X'),
-    (0x10C7, 'M', 'â´§'),
-    (0x10C8, 'X'),
-    (0x10CD, 'M', 'â´­'),
-    (0x10CE, 'X'),
-    (0x10D0, 'V'),
-    (0x10FC, 'M', 'ნ'),
-    (0x10FD, 'V'),
-    (0x115F, 'X'),
-    (0x1161, 'V'),
-    (0x1249, 'X'),
-    (0x124A, 'V'),
-    (0x124E, 'X'),
-    (0x1250, 'V'),
-    (0x1257, 'X'),
-    (0x1258, 'V'),
-    (0x1259, 'X'),
-    (0x125A, 'V'),
-    (0x125E, 'X'),
-    (0x1260, 'V'),
-    (0x1289, 'X'),
-    (0x128A, 'V'),
-    (0x128E, 'X'),
-    (0x1290, 'V'),
-    (0x12B1, 'X'),
-    (0x12B2, 'V'),
-    (0x12B6, 'X'),
-    (0x12B8, 'V'),
-    (0x12BF, 'X'),
-    (0x12C0, 'V'),
-    (0x12C1, 'X'),
-    (0x12C2, 'V'),
-    (0x12C6, 'X'),
-    (0x12C8, 'V'),
-    (0x12D7, 'X'),
-    (0x12D8, 'V'),
-    (0x1311, 'X'),
-    (0x1312, 'V'),
-    ]
-
-def _seg_14() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
-    return [
-    (0x1316, 'X'),
-    (0x1318, 'V'),
-    (0x135B, 'X'),
-    (0x135D, 'V'),
-    (0x137D, 'X'),
-    (0x1380, 'V'),
-    (0x139A, 'X'),
-    (0x13A0, 'V'),
-    (0x13F6, 'X'),
-    (0x13F8, 'M', 'á°'),
-    (0x13F9, 'M', 'á±'),
-    (0x13FA, 'M', 'á²'),
-    (0x13FB, 'M', 'á³'),
-    (0x13FC, 'M', 'á´'),
-    (0x13FD, 'M', 'áµ'),
-    (0x13FE, 'X'),
-    (0x1400, 'V'),
-    (0x1680, 'X'),
-    (0x1681, 'V'),
-    (0x169D, 'X'),
-    (0x16A0, 'V'),
-    (0x16F9, 'X'),
-    (0x1700, 'V'),
-    (0x1716, 'X'),
-    (0x171F, 'V'),
-    (0x1737, 'X'),
-    (0x1740, 'V'),
-    (0x1754, 'X'),
-    (0x1760, 'V'),
-    (0x176D, 'X'),
-    (0x176E, 'V'),
-    (0x1771, 'X'),
-    (0x1772, 'V'),
-    (0x1774, 'X'),
-    (0x1780, 'V'),
-    (0x17B4, 'X'),
-    (0x17B6, 'V'),
-    (0x17DE, 'X'),
-    (0x17E0, 'V'),
-    (0x17EA, 'X'),
-    (0x17F0, 'V'),
-    (0x17FA, 'X'),
-    (0x1800, 'V'),
-    (0x1806, 'X'),
-    (0x1807, 'V'),
-    (0x180B, 'I'),
-    (0x180E, 'X'),
-    (0x180F, 'I'),
-    (0x1810, 'V'),
-    (0x181A, 'X'),
-    (0x1820, 'V'),
-    (0x1879, 'X'),
-    (0x1880, 'V'),
-    (0x18AB, 'X'),
-    (0x18B0, 'V'),
-    (0x18F6, 'X'),
-    (0x1900, 'V'),
-    (0x191F, 'X'),
-    (0x1920, 'V'),
-    (0x192C, 'X'),
-    (0x1930, 'V'),
-    (0x193C, 'X'),
-    (0x1940, 'V'),
-    (0x1941, 'X'),
-    (0x1944, 'V'),
-    (0x196E, 'X'),
-    (0x1970, 'V'),
-    (0x1975, 'X'),
-    (0x1980, 'V'),
-    (0x19AC, 'X'),
-    (0x19B0, 'V'),
-    (0x19CA, 'X'),
-    (0x19D0, 'V'),
-    (0x19DB, 'X'),
-    (0x19DE, 'V'),
-    (0x1A1C, 'X'),
-    (0x1A1E, 'V'),
-    (0x1A5F, 'X'),
-    (0x1A60, 'V'),
-    (0x1A7D, 'X'),
-    (0x1A7F, 'V'),
-    (0x1A8A, 'X'),
-    (0x1A90, 'V'),
-    (0x1A9A, 'X'),
-    (0x1AA0, 'V'),
-    (0x1AAE, 'X'),
-    (0x1AB0, 'V'),
-    (0x1ACF, 'X'),
-    (0x1B00, 'V'),
-    (0x1B4D, 'X'),
-    (0x1B50, 'V'),
-    (0x1B7F, 'X'),
-    (0x1B80, 'V'),
-    (0x1BF4, 'X'),
-    (0x1BFC, 'V'),
-    (0x1C38, 'X'),
-    (0x1C3B, 'V'),
-    (0x1C4A, 'X'),
-    (0x1C4D, 'V'),
-    (0x1C80, 'M', 'в'),
-    ]
-
-def _seg_15() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
-    return [
-    (0x1C81, 'M', 'д'),
-    (0x1C82, 'M', 'о'),
-    (0x1C83, 'M', 'Ñ'),
-    (0x1C84, 'M', 'Ñ‚'),
-    (0x1C86, 'M', 'ÑŠ'),
-    (0x1C87, 'M', 'Ñ£'),
-    (0x1C88, 'M', 'ꙋ'),
-    (0x1C89, 'X'),
-    (0x1C90, 'M', 'áƒ'),
-    (0x1C91, 'M', 'ბ'),
-    (0x1C92, 'M', 'გ'),
-    (0x1C93, 'M', 'დ'),
-    (0x1C94, 'M', 'ე'),
-    (0x1C95, 'M', 'ვ'),
-    (0x1C96, 'M', 'ზ'),
-    (0x1C97, 'M', 'თ'),
-    (0x1C98, 'M', 'ი'),
-    (0x1C99, 'M', 'კ'),
-    (0x1C9A, 'M', 'ლ'),
-    (0x1C9B, 'M', 'მ'),
-    (0x1C9C, 'M', 'ნ'),
-    (0x1C9D, 'M', 'áƒ'),
-    (0x1C9E, 'M', 'პ'),
-    (0x1C9F, 'M', 'ჟ'),
-    (0x1CA0, 'M', 'რ'),
-    (0x1CA1, 'M', 'ს'),
-    (0x1CA2, 'M', 'ტ'),
-    (0x1CA3, 'M', 'უ'),
-    (0x1CA4, 'M', 'ფ'),
-    (0x1CA5, 'M', 'ქ'),
-    (0x1CA6, 'M', 'ღ'),
-    (0x1CA7, 'M', 'ყ'),
-    (0x1CA8, 'M', 'შ'),
-    (0x1CA9, 'M', 'ჩ'),
-    (0x1CAA, 'M', 'ც'),
-    (0x1CAB, 'M', 'ძ'),
-    (0x1CAC, 'M', 'წ'),
-    (0x1CAD, 'M', 'ჭ'),
-    (0x1CAE, 'M', 'ხ'),
-    (0x1CAF, 'M', 'ჯ'),
-    (0x1CB0, 'M', 'ჰ'),
-    (0x1CB1, 'M', 'ჱ'),
-    (0x1CB2, 'M', 'ჲ'),
-    (0x1CB3, 'M', 'ჳ'),
-    (0x1CB4, 'M', 'ჴ'),
-    (0x1CB5, 'M', 'ჵ'),
-    (0x1CB6, 'M', 'ჶ'),
-    (0x1CB7, 'M', 'ჷ'),
-    (0x1CB8, 'M', 'ჸ'),
-    (0x1CB9, 'M', 'ჹ'),
-    (0x1CBA, 'M', 'ჺ'),
-    (0x1CBB, 'X'),
-    (0x1CBD, 'M', 'ჽ'),
-    (0x1CBE, 'M', 'ჾ'),
-    (0x1CBF, 'M', 'ჿ'),
-    (0x1CC0, 'V'),
-    (0x1CC8, 'X'),
-    (0x1CD0, 'V'),
-    (0x1CFB, 'X'),
-    (0x1D00, 'V'),
-    (0x1D2C, 'M', 'a'),
-    (0x1D2D, 'M', 'æ'),
-    (0x1D2E, 'M', 'b'),
-    (0x1D2F, 'V'),
-    (0x1D30, 'M', 'd'),
-    (0x1D31, 'M', 'e'),
-    (0x1D32, 'M', 'Ç'),
-    (0x1D33, 'M', 'g'),
-    (0x1D34, 'M', 'h'),
-    (0x1D35, 'M', 'i'),
-    (0x1D36, 'M', 'j'),
-    (0x1D37, 'M', 'k'),
-    (0x1D38, 'M', 'l'),
-    (0x1D39, 'M', 'm'),
-    (0x1D3A, 'M', 'n'),
-    (0x1D3B, 'V'),
-    (0x1D3C, 'M', 'o'),
-    (0x1D3D, 'M', 'È£'),
-    (0x1D3E, 'M', 'p'),
-    (0x1D3F, 'M', 'r'),
-    (0x1D40, 'M', 't'),
-    (0x1D41, 'M', 'u'),
-    (0x1D42, 'M', 'w'),
-    (0x1D43, 'M', 'a'),
-    (0x1D44, 'M', 'É'),
-    (0x1D45, 'M', 'É‘'),
-    (0x1D46, 'M', 'á´‚'),
-    (0x1D47, 'M', 'b'),
-    (0x1D48, 'M', 'd'),
-    (0x1D49, 'M', 'e'),
-    (0x1D4A, 'M', 'É™'),
-    (0x1D4B, 'M', 'É›'),
-    (0x1D4C, 'M', 'ɜ'),
-    (0x1D4D, 'M', 'g'),
-    (0x1D4E, 'V'),
-    (0x1D4F, 'M', 'k'),
-    (0x1D50, 'M', 'm'),
-    (0x1D51, 'M', 'Å‹'),
-    (0x1D52, 'M', 'o'),
-    (0x1D53, 'M', 'É”'),
-    ]
-
-def _seg_16() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
-    return [
-    (0x1D54, 'M', 'á´–'),
-    (0x1D55, 'M', 'á´—'),
-    (0x1D56, 'M', 'p'),
-    (0x1D57, 'M', 't'),
-    (0x1D58, 'M', 'u'),
-    (0x1D59, 'M', 'á´'),
-    (0x1D5A, 'M', 'ɯ'),
-    (0x1D5B, 'M', 'v'),
-    (0x1D5C, 'M', 'á´¥'),
-    (0x1D5D, 'M', 'β'),
-    (0x1D5E, 'M', 'γ'),
-    (0x1D5F, 'M', 'δ'),
-    (0x1D60, 'M', 'φ'),
-    (0x1D61, 'M', 'χ'),
-    (0x1D62, 'M', 'i'),
-    (0x1D63, 'M', 'r'),
-    (0x1D64, 'M', 'u'),
-    (0x1D65, 'M', 'v'),
-    (0x1D66, 'M', 'β'),
-    (0x1D67, 'M', 'γ'),
-    (0x1D68, 'M', 'Ï'),
-    (0x1D69, 'M', 'φ'),
-    (0x1D6A, 'M', 'χ'),
-    (0x1D6B, 'V'),
-    (0x1D78, 'M', 'н'),
-    (0x1D79, 'V'),
-    (0x1D9B, 'M', 'É’'),
-    (0x1D9C, 'M', 'c'),
-    (0x1D9D, 'M', 'É•'),
-    (0x1D9E, 'M', 'ð'),
-    (0x1D9F, 'M', 'ɜ'),
-    (0x1DA0, 'M', 'f'),
-    (0x1DA1, 'M', 'ÉŸ'),
-    (0x1DA2, 'M', 'É¡'),
-    (0x1DA3, 'M', 'É¥'),
-    (0x1DA4, 'M', 'ɨ'),
-    (0x1DA5, 'M', 'É©'),
-    (0x1DA6, 'M', 'ɪ'),
-    (0x1DA7, 'M', 'áµ»'),
-    (0x1DA8, 'M', 'Ê'),
-    (0x1DA9, 'M', 'É­'),
-    (0x1DAA, 'M', 'á¶…'),
-    (0x1DAB, 'M', 'ÊŸ'),
-    (0x1DAC, 'M', 'ɱ'),
-    (0x1DAD, 'M', 'ɰ'),
-    (0x1DAE, 'M', 'ɲ'),
-    (0x1DAF, 'M', 'ɳ'),
-    (0x1DB0, 'M', 'É´'),
-    (0x1DB1, 'M', 'ɵ'),
-    (0x1DB2, 'M', 'ɸ'),
-    (0x1DB3, 'M', 'Ê‚'),
-    (0x1DB4, 'M', 'ʃ'),
-    (0x1DB5, 'M', 'Æ«'),
-    (0x1DB6, 'M', 'ʉ'),
-    (0x1DB7, 'M', 'ÊŠ'),
-    (0x1DB8, 'M', 'ᴜ'),
-    (0x1DB9, 'M', 'Ê‹'),
-    (0x1DBA, 'M', 'ʌ'),
-    (0x1DBB, 'M', 'z'),
-    (0x1DBC, 'M', 'Ê'),
-    (0x1DBD, 'M', 'Ê‘'),
-    (0x1DBE, 'M', 'Ê’'),
-    (0x1DBF, 'M', 'θ'),
-    (0x1DC0, 'V'),
-    (0x1E00, 'M', 'á¸'),
-    (0x1E01, 'V'),
-    (0x1E02, 'M', 'ḃ'),
-    (0x1E03, 'V'),
-    (0x1E04, 'M', 'ḅ'),
-    (0x1E05, 'V'),
-    (0x1E06, 'M', 'ḇ'),
-    (0x1E07, 'V'),
-    (0x1E08, 'M', 'ḉ'),
-    (0x1E09, 'V'),
-    (0x1E0A, 'M', 'ḋ'),
-    (0x1E0B, 'V'),
-    (0x1E0C, 'M', 'á¸'),
-    (0x1E0D, 'V'),
-    (0x1E0E, 'M', 'á¸'),
-    (0x1E0F, 'V'),
-    (0x1E10, 'M', 'ḑ'),
-    (0x1E11, 'V'),
-    (0x1E12, 'M', 'ḓ'),
-    (0x1E13, 'V'),
-    (0x1E14, 'M', 'ḕ'),
-    (0x1E15, 'V'),
-    (0x1E16, 'M', 'ḗ'),
-    (0x1E17, 'V'),
-    (0x1E18, 'M', 'ḙ'),
-    (0x1E19, 'V'),
-    (0x1E1A, 'M', 'ḛ'),
-    (0x1E1B, 'V'),
-    (0x1E1C, 'M', 'á¸'),
-    (0x1E1D, 'V'),
-    (0x1E1E, 'M', 'ḟ'),
-    (0x1E1F, 'V'),
-    (0x1E20, 'M', 'ḡ'),
-    (0x1E21, 'V'),
-    (0x1E22, 'M', 'ḣ'),
-    (0x1E23, 'V'),
-    ]
-
-def _seg_17() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
-    return [
-    (0x1E24, 'M', 'ḥ'),
-    (0x1E25, 'V'),
-    (0x1E26, 'M', 'ḧ'),
-    (0x1E27, 'V'),
-    (0x1E28, 'M', 'ḩ'),
-    (0x1E29, 'V'),
-    (0x1E2A, 'M', 'ḫ'),
-    (0x1E2B, 'V'),
-    (0x1E2C, 'M', 'ḭ'),
-    (0x1E2D, 'V'),
-    (0x1E2E, 'M', 'ḯ'),
-    (0x1E2F, 'V'),
-    (0x1E30, 'M', 'ḱ'),
-    (0x1E31, 'V'),
-    (0x1E32, 'M', 'ḳ'),
-    (0x1E33, 'V'),
-    (0x1E34, 'M', 'ḵ'),
-    (0x1E35, 'V'),
-    (0x1E36, 'M', 'ḷ'),
-    (0x1E37, 'V'),
-    (0x1E38, 'M', 'ḹ'),
-    (0x1E39, 'V'),
-    (0x1E3A, 'M', 'ḻ'),
-    (0x1E3B, 'V'),
-    (0x1E3C, 'M', 'ḽ'),
-    (0x1E3D, 'V'),
-    (0x1E3E, 'M', 'ḿ'),
-    (0x1E3F, 'V'),
-    (0x1E40, 'M', 'á¹'),
-    (0x1E41, 'V'),
-    (0x1E42, 'M', 'ṃ'),
-    (0x1E43, 'V'),
-    (0x1E44, 'M', 'á¹…'),
-    (0x1E45, 'V'),
-    (0x1E46, 'M', 'ṇ'),
-    (0x1E47, 'V'),
-    (0x1E48, 'M', 'ṉ'),
-    (0x1E49, 'V'),
-    (0x1E4A, 'M', 'ṋ'),
-    (0x1E4B, 'V'),
-    (0x1E4C, 'M', 'á¹'),
-    (0x1E4D, 'V'),
-    (0x1E4E, 'M', 'á¹'),
-    (0x1E4F, 'V'),
-    (0x1E50, 'M', 'ṑ'),
-    (0x1E51, 'V'),
-    (0x1E52, 'M', 'ṓ'),
-    (0x1E53, 'V'),
-    (0x1E54, 'M', 'ṕ'),
-    (0x1E55, 'V'),
-    (0x1E56, 'M', 'á¹—'),
-    (0x1E57, 'V'),
-    (0x1E58, 'M', 'á¹™'),
-    (0x1E59, 'V'),
-    (0x1E5A, 'M', 'á¹›'),
-    (0x1E5B, 'V'),
-    (0x1E5C, 'M', 'á¹'),
-    (0x1E5D, 'V'),
-    (0x1E5E, 'M', 'ṟ'),
-    (0x1E5F, 'V'),
-    (0x1E60, 'M', 'ṡ'),
-    (0x1E61, 'V'),
-    (0x1E62, 'M', 'á¹£'),
-    (0x1E63, 'V'),
-    (0x1E64, 'M', 'á¹¥'),
-    (0x1E65, 'V'),
-    (0x1E66, 'M', 'á¹§'),
-    (0x1E67, 'V'),
-    (0x1E68, 'M', 'ṩ'),
-    (0x1E69, 'V'),
-    (0x1E6A, 'M', 'ṫ'),
-    (0x1E6B, 'V'),
-    (0x1E6C, 'M', 'á¹­'),
-    (0x1E6D, 'V'),
-    (0x1E6E, 'M', 'ṯ'),
-    (0x1E6F, 'V'),
-    (0x1E70, 'M', 'á¹±'),
-    (0x1E71, 'V'),
-    (0x1E72, 'M', 'á¹³'),
-    (0x1E73, 'V'),
-    (0x1E74, 'M', 'á¹µ'),
-    (0x1E75, 'V'),
-    (0x1E76, 'M', 'á¹·'),
-    (0x1E77, 'V'),
-    (0x1E78, 'M', 'á¹¹'),
-    (0x1E79, 'V'),
-    (0x1E7A, 'M', 'á¹»'),
-    (0x1E7B, 'V'),
-    (0x1E7C, 'M', 'á¹½'),
-    (0x1E7D, 'V'),
-    (0x1E7E, 'M', 'ṿ'),
-    (0x1E7F, 'V'),
-    (0x1E80, 'M', 'áº'),
-    (0x1E81, 'V'),
-    (0x1E82, 'M', 'ẃ'),
-    (0x1E83, 'V'),
-    (0x1E84, 'M', 'ẅ'),
-    (0x1E85, 'V'),
-    (0x1E86, 'M', 'ẇ'),
-    (0x1E87, 'V'),
-    ]
-
-def _seg_18() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
-    return [
-    (0x1E88, 'M', 'ẉ'),
-    (0x1E89, 'V'),
-    (0x1E8A, 'M', 'ẋ'),
-    (0x1E8B, 'V'),
-    (0x1E8C, 'M', 'áº'),
-    (0x1E8D, 'V'),
-    (0x1E8E, 'M', 'áº'),
-    (0x1E8F, 'V'),
-    (0x1E90, 'M', 'ẑ'),
-    (0x1E91, 'V'),
-    (0x1E92, 'M', 'ẓ'),
-    (0x1E93, 'V'),
-    (0x1E94, 'M', 'ẕ'),
-    (0x1E95, 'V'),
-    (0x1E9A, 'M', 'aʾ'),
-    (0x1E9B, 'M', 'ṡ'),
-    (0x1E9C, 'V'),
-    (0x1E9E, 'M', 'ss'),
-    (0x1E9F, 'V'),
-    (0x1EA0, 'M', 'ạ'),
-    (0x1EA1, 'V'),
-    (0x1EA2, 'M', 'ả'),
-    (0x1EA3, 'V'),
-    (0x1EA4, 'M', 'ấ'),
-    (0x1EA5, 'V'),
-    (0x1EA6, 'M', 'ầ'),
-    (0x1EA7, 'V'),
-    (0x1EA8, 'M', 'ẩ'),
-    (0x1EA9, 'V'),
-    (0x1EAA, 'M', 'ẫ'),
-    (0x1EAB, 'V'),
-    (0x1EAC, 'M', 'ậ'),
-    (0x1EAD, 'V'),
-    (0x1EAE, 'M', 'ắ'),
-    (0x1EAF, 'V'),
-    (0x1EB0, 'M', 'ằ'),
-    (0x1EB1, 'V'),
-    (0x1EB2, 'M', 'ẳ'),
-    (0x1EB3, 'V'),
-    (0x1EB4, 'M', 'ẵ'),
-    (0x1EB5, 'V'),
-    (0x1EB6, 'M', 'ặ'),
-    (0x1EB7, 'V'),
-    (0x1EB8, 'M', 'ẹ'),
-    (0x1EB9, 'V'),
-    (0x1EBA, 'M', 'ẻ'),
-    (0x1EBB, 'V'),
-    (0x1EBC, 'M', 'ẽ'),
-    (0x1EBD, 'V'),
-    (0x1EBE, 'M', 'ế'),
-    (0x1EBF, 'V'),
-    (0x1EC0, 'M', 'á»'),
-    (0x1EC1, 'V'),
-    (0x1EC2, 'M', 'ể'),
-    (0x1EC3, 'V'),
-    (0x1EC4, 'M', 'á»…'),
-    (0x1EC5, 'V'),
-    (0x1EC6, 'M', 'ệ'),
-    (0x1EC7, 'V'),
-    (0x1EC8, 'M', 'ỉ'),
-    (0x1EC9, 'V'),
-    (0x1ECA, 'M', 'ị'),
-    (0x1ECB, 'V'),
-    (0x1ECC, 'M', 'á»'),
-    (0x1ECD, 'V'),
-    (0x1ECE, 'M', 'á»'),
-    (0x1ECF, 'V'),
-    (0x1ED0, 'M', 'ố'),
-    (0x1ED1, 'V'),
-    (0x1ED2, 'M', 'ồ'),
-    (0x1ED3, 'V'),
-    (0x1ED4, 'M', 'ổ'),
-    (0x1ED5, 'V'),
-    (0x1ED6, 'M', 'á»—'),
-    (0x1ED7, 'V'),
-    (0x1ED8, 'M', 'á»™'),
-    (0x1ED9, 'V'),
-    (0x1EDA, 'M', 'á»›'),
-    (0x1EDB, 'V'),
-    (0x1EDC, 'M', 'á»'),
-    (0x1EDD, 'V'),
-    (0x1EDE, 'M', 'ở'),
-    (0x1EDF, 'V'),
-    (0x1EE0, 'M', 'ỡ'),
-    (0x1EE1, 'V'),
-    (0x1EE2, 'M', 'ợ'),
-    (0x1EE3, 'V'),
-    (0x1EE4, 'M', 'ụ'),
-    (0x1EE5, 'V'),
-    (0x1EE6, 'M', 'á»§'),
-    (0x1EE7, 'V'),
-    (0x1EE8, 'M', 'ứ'),
-    (0x1EE9, 'V'),
-    (0x1EEA, 'M', 'ừ'),
-    (0x1EEB, 'V'),
-    (0x1EEC, 'M', 'á»­'),
-    (0x1EED, 'V'),
-    (0x1EEE, 'M', 'ữ'),
-    (0x1EEF, 'V'),
-    (0x1EF0, 'M', 'á»±'),
-    ]
-
-def _seg_19() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
-    return [
-    (0x1EF1, 'V'),
-    (0x1EF2, 'M', 'ỳ'),
-    (0x1EF3, 'V'),
-    (0x1EF4, 'M', 'ỵ'),
-    (0x1EF5, 'V'),
-    (0x1EF6, 'M', 'á»·'),
-    (0x1EF7, 'V'),
-    (0x1EF8, 'M', 'ỹ'),
-    (0x1EF9, 'V'),
-    (0x1EFA, 'M', 'á»»'),
-    (0x1EFB, 'V'),
-    (0x1EFC, 'M', 'ỽ'),
-    (0x1EFD, 'V'),
-    (0x1EFE, 'M', 'ỿ'),
-    (0x1EFF, 'V'),
-    (0x1F08, 'M', 'á¼€'),
-    (0x1F09, 'M', 'á¼'),
-    (0x1F0A, 'M', 'ἂ'),
-    (0x1F0B, 'M', 'ἃ'),
-    (0x1F0C, 'M', 'ἄ'),
-    (0x1F0D, 'M', 'á¼…'),
-    (0x1F0E, 'M', 'ἆ'),
-    (0x1F0F, 'M', 'ἇ'),
-    (0x1F10, 'V'),
-    (0x1F16, 'X'),
-    (0x1F18, 'M', 'á¼'),
-    (0x1F19, 'M', 'ἑ'),
-    (0x1F1A, 'M', 'á¼’'),
-    (0x1F1B, 'M', 'ἓ'),
-    (0x1F1C, 'M', 'á¼”'),
-    (0x1F1D, 'M', 'ἕ'),
-    (0x1F1E, 'X'),
-    (0x1F20, 'V'),
-    (0x1F28, 'M', 'á¼ '),
-    (0x1F29, 'M', 'ἡ'),
-    (0x1F2A, 'M', 'á¼¢'),
-    (0x1F2B, 'M', 'á¼£'),
-    (0x1F2C, 'M', 'ἤ'),
-    (0x1F2D, 'M', 'á¼¥'),
-    (0x1F2E, 'M', 'ἦ'),
-    (0x1F2F, 'M', 'á¼§'),
-    (0x1F30, 'V'),
-    (0x1F38, 'M', 'á¼°'),
-    (0x1F39, 'M', 'á¼±'),
-    (0x1F3A, 'M', 'á¼²'),
-    (0x1F3B, 'M', 'á¼³'),
-    (0x1F3C, 'M', 'á¼´'),
-    (0x1F3D, 'M', 'á¼µ'),
-    (0x1F3E, 'M', 'á¼¶'),
-    (0x1F3F, 'M', 'á¼·'),
-    (0x1F40, 'V'),
-    (0x1F46, 'X'),
-    (0x1F48, 'M', 'á½€'),
-    (0x1F49, 'M', 'á½'),
-    (0x1F4A, 'M', 'ὂ'),
-    (0x1F4B, 'M', 'ὃ'),
-    (0x1F4C, 'M', 'ὄ'),
-    (0x1F4D, 'M', 'á½…'),
-    (0x1F4E, 'X'),
-    (0x1F50, 'V'),
-    (0x1F58, 'X'),
-    (0x1F59, 'M', 'ὑ'),
-    (0x1F5A, 'X'),
-    (0x1F5B, 'M', 'ὓ'),
-    (0x1F5C, 'X'),
-    (0x1F5D, 'M', 'ὕ'),
-    (0x1F5E, 'X'),
-    (0x1F5F, 'M', 'á½—'),
-    (0x1F60, 'V'),
-    (0x1F68, 'M', 'á½ '),
-    (0x1F69, 'M', 'ὡ'),
-    (0x1F6A, 'M', 'á½¢'),
-    (0x1F6B, 'M', 'á½£'),
-    (0x1F6C, 'M', 'ὤ'),
-    (0x1F6D, 'M', 'á½¥'),
-    (0x1F6E, 'M', 'ὦ'),
-    (0x1F6F, 'M', 'á½§'),
-    (0x1F70, 'V'),
-    (0x1F71, 'M', 'ά'),
-    (0x1F72, 'V'),
-    (0x1F73, 'M', 'έ'),
-    (0x1F74, 'V'),
-    (0x1F75, 'M', 'ή'),
-    (0x1F76, 'V'),
-    (0x1F77, 'M', 'ί'),
-    (0x1F78, 'V'),
-    (0x1F79, 'M', 'ό'),
-    (0x1F7A, 'V'),
-    (0x1F7B, 'M', 'Ï'),
-    (0x1F7C, 'V'),
-    (0x1F7D, 'M', 'ÏŽ'),
-    (0x1F7E, 'X'),
-    (0x1F80, 'M', 'ἀι'),
-    (0x1F81, 'M', 'á¼Î¹'),
-    (0x1F82, 'M', 'ἂι'),
-    (0x1F83, 'M', 'ἃι'),
-    (0x1F84, 'M', 'ἄι'),
-    (0x1F85, 'M', 'ἅι'),
-    (0x1F86, 'M', 'ἆι'),
-    (0x1F87, 'M', 'ἇι'),
-    ]
-
-def _seg_20() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
-    return [
-    (0x1F88, 'M', 'ἀι'),
-    (0x1F89, 'M', 'á¼Î¹'),
-    (0x1F8A, 'M', 'ἂι'),
-    (0x1F8B, 'M', 'ἃι'),
-    (0x1F8C, 'M', 'ἄι'),
-    (0x1F8D, 'M', 'ἅι'),
-    (0x1F8E, 'M', 'ἆι'),
-    (0x1F8F, 'M', 'ἇι'),
-    (0x1F90, 'M', 'ἠι'),
-    (0x1F91, 'M', 'ἡι'),
-    (0x1F92, 'M', 'ἢι'),
-    (0x1F93, 'M', 'ἣι'),
-    (0x1F94, 'M', 'ἤι'),
-    (0x1F95, 'M', 'ἥι'),
-    (0x1F96, 'M', 'ἦι'),
-    (0x1F97, 'M', 'ἧι'),
-    (0x1F98, 'M', 'ἠι'),
-    (0x1F99, 'M', 'ἡι'),
-    (0x1F9A, 'M', 'ἢι'),
-    (0x1F9B, 'M', 'ἣι'),
-    (0x1F9C, 'M', 'ἤι'),
-    (0x1F9D, 'M', 'ἥι'),
-    (0x1F9E, 'M', 'ἦι'),
-    (0x1F9F, 'M', 'ἧι'),
-    (0x1FA0, 'M', 'ὠι'),
-    (0x1FA1, 'M', 'ὡι'),
-    (0x1FA2, 'M', 'ὢι'),
-    (0x1FA3, 'M', 'ὣι'),
-    (0x1FA4, 'M', 'ὤι'),
-    (0x1FA5, 'M', 'ὥι'),
-    (0x1FA6, 'M', 'ὦι'),
-    (0x1FA7, 'M', 'ὧι'),
-    (0x1FA8, 'M', 'ὠι'),
-    (0x1FA9, 'M', 'ὡι'),
-    (0x1FAA, 'M', 'ὢι'),
-    (0x1FAB, 'M', 'ὣι'),
-    (0x1FAC, 'M', 'ὤι'),
-    (0x1FAD, 'M', 'ὥι'),
-    (0x1FAE, 'M', 'ὦι'),
-    (0x1FAF, 'M', 'ὧι'),
-    (0x1FB0, 'V'),
-    (0x1FB2, 'M', 'ὰι'),
-    (0x1FB3, 'M', 'αι'),
-    (0x1FB4, 'M', 'άι'),
-    (0x1FB5, 'X'),
-    (0x1FB6, 'V'),
-    (0x1FB7, 'M', 'ᾶι'),
-    (0x1FB8, 'M', 'á¾°'),
-    (0x1FB9, 'M', 'á¾±'),
-    (0x1FBA, 'M', 'á½°'),
-    (0x1FBB, 'M', 'ά'),
-    (0x1FBC, 'M', 'αι'),
-    (0x1FBD, '3', ' Ì“'),
-    (0x1FBE, 'M', 'ι'),
-    (0x1FBF, '3', ' Ì“'),
-    (0x1FC0, '3', ' Í‚'),
-    (0x1FC1, '3', ' ̈͂'),
-    (0x1FC2, 'M', 'ὴι'),
-    (0x1FC3, 'M', 'ηι'),
-    (0x1FC4, 'M', 'ήι'),
-    (0x1FC5, 'X'),
-    (0x1FC6, 'V'),
-    (0x1FC7, 'M', 'ῆι'),
-    (0x1FC8, 'M', 'á½²'),
-    (0x1FC9, 'M', 'έ'),
-    (0x1FCA, 'M', 'á½´'),
-    (0x1FCB, 'M', 'ή'),
-    (0x1FCC, 'M', 'ηι'),
-    (0x1FCD, '3', ' ̓̀'),
-    (0x1FCE, '3', ' Ì“Ì'),
-    (0x1FCF, '3', ' ̓͂'),
-    (0x1FD0, 'V'),
-    (0x1FD3, 'M', 'Î'),
-    (0x1FD4, 'X'),
-    (0x1FD6, 'V'),
-    (0x1FD8, 'M', 'á¿'),
-    (0x1FD9, 'M', 'á¿‘'),
-    (0x1FDA, 'M', 'á½¶'),
-    (0x1FDB, 'M', 'ί'),
-    (0x1FDC, 'X'),
-    (0x1FDD, '3', ' ̔̀'),
-    (0x1FDE, '3', ' Ì”Ì'),
-    (0x1FDF, '3', ' ̔͂'),
-    (0x1FE0, 'V'),
-    (0x1FE3, 'M', 'ΰ'),
-    (0x1FE4, 'V'),
-    (0x1FE8, 'M', 'á¿ '),
-    (0x1FE9, 'M', 'á¿¡'),
-    (0x1FEA, 'M', 'ὺ'),
-    (0x1FEB, 'M', 'Ï'),
-    (0x1FEC, 'M', 'á¿¥'),
-    (0x1FED, '3', ' ̈̀'),
-    (0x1FEE, '3', ' ̈Ì'),
-    (0x1FEF, '3', '`'),
-    (0x1FF0, 'X'),
-    (0x1FF2, 'M', 'ὼι'),
-    (0x1FF3, 'M', 'ωι'),
-    (0x1FF4, 'M', 'ώι'),
-    (0x1FF5, 'X'),
-    (0x1FF6, 'V'),
-    ]
-
-def _seg_21() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
-    return [
-    (0x1FF7, 'M', 'ῶι'),
-    (0x1FF8, 'M', 'ὸ'),
-    (0x1FF9, 'M', 'ό'),
-    (0x1FFA, 'M', 'á½¼'),
-    (0x1FFB, 'M', 'ÏŽ'),
-    (0x1FFC, 'M', 'ωι'),
-    (0x1FFD, '3', ' Ì'),
-    (0x1FFE, '3', ' Ì”'),
-    (0x1FFF, 'X'),
-    (0x2000, '3', ' '),
-    (0x200B, 'I'),
-    (0x200C, 'D', ''),
-    (0x200E, 'X'),
-    (0x2010, 'V'),
-    (0x2011, 'M', 'â€'),
-    (0x2012, 'V'),
-    (0x2017, '3', ' ̳'),
-    (0x2018, 'V'),
-    (0x2024, 'X'),
-    (0x2027, 'V'),
-    (0x2028, 'X'),
-    (0x202F, '3', ' '),
-    (0x2030, 'V'),
-    (0x2033, 'M', '′′'),
-    (0x2034, 'M', '′′′'),
-    (0x2035, 'V'),
-    (0x2036, 'M', '‵‵'),
-    (0x2037, 'M', '‵‵‵'),
-    (0x2038, 'V'),
-    (0x203C, '3', '!!'),
-    (0x203D, 'V'),
-    (0x203E, '3', ' Ì…'),
-    (0x203F, 'V'),
-    (0x2047, '3', '??'),
-    (0x2048, '3', '?!'),
-    (0x2049, '3', '!?'),
-    (0x204A, 'V'),
-    (0x2057, 'M', '′′′′'),
-    (0x2058, 'V'),
-    (0x205F, '3', ' '),
-    (0x2060, 'I'),
-    (0x2061, 'X'),
-    (0x2064, 'I'),
-    (0x2065, 'X'),
-    (0x2070, 'M', '0'),
-    (0x2071, 'M', 'i'),
-    (0x2072, 'X'),
-    (0x2074, 'M', '4'),
-    (0x2075, 'M', '5'),
-    (0x2076, 'M', '6'),
-    (0x2077, 'M', '7'),
-    (0x2078, 'M', '8'),
-    (0x2079, 'M', '9'),
-    (0x207A, '3', '+'),
-    (0x207B, 'M', '−'),
-    (0x207C, '3', '='),
-    (0x207D, '3', '('),
-    (0x207E, '3', ')'),
-    (0x207F, 'M', 'n'),
-    (0x2080, 'M', '0'),
-    (0x2081, 'M', '1'),
-    (0x2082, 'M', '2'),
-    (0x2083, 'M', '3'),
-    (0x2084, 'M', '4'),
-    (0x2085, 'M', '5'),
-    (0x2086, 'M', '6'),
-    (0x2087, 'M', '7'),
-    (0x2088, 'M', '8'),
-    (0x2089, 'M', '9'),
-    (0x208A, '3', '+'),
-    (0x208B, 'M', '−'),
-    (0x208C, '3', '='),
-    (0x208D, '3', '('),
-    (0x208E, '3', ')'),
-    (0x208F, 'X'),
-    (0x2090, 'M', 'a'),
-    (0x2091, 'M', 'e'),
-    (0x2092, 'M', 'o'),
-    (0x2093, 'M', 'x'),
-    (0x2094, 'M', 'É™'),
-    (0x2095, 'M', 'h'),
-    (0x2096, 'M', 'k'),
-    (0x2097, 'M', 'l'),
-    (0x2098, 'M', 'm'),
-    (0x2099, 'M', 'n'),
-    (0x209A, 'M', 'p'),
-    (0x209B, 'M', 's'),
-    (0x209C, 'M', 't'),
-    (0x209D, 'X'),
-    (0x20A0, 'V'),
-    (0x20A8, 'M', 'rs'),
-    (0x20A9, 'V'),
-    (0x20C1, 'X'),
-    (0x20D0, 'V'),
-    (0x20F1, 'X'),
-    (0x2100, '3', 'a/c'),
-    (0x2101, '3', 'a/s'),
-    (0x2102, 'M', 'c'),
-    (0x2103, 'M', '°c'),
-    (0x2104, 'V'),
-    ]
-
-def _seg_22() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
-    return [
-    (0x2105, '3', 'c/o'),
-    (0x2106, '3', 'c/u'),
-    (0x2107, 'M', 'É›'),
-    (0x2108, 'V'),
-    (0x2109, 'M', '°f'),
-    (0x210A, 'M', 'g'),
-    (0x210B, 'M', 'h'),
-    (0x210F, 'M', 'ħ'),
-    (0x2110, 'M', 'i'),
-    (0x2112, 'M', 'l'),
-    (0x2114, 'V'),
-    (0x2115, 'M', 'n'),
-    (0x2116, 'M', 'no'),
-    (0x2117, 'V'),
-    (0x2119, 'M', 'p'),
-    (0x211A, 'M', 'q'),
-    (0x211B, 'M', 'r'),
-    (0x211E, 'V'),
-    (0x2120, 'M', 'sm'),
-    (0x2121, 'M', 'tel'),
-    (0x2122, 'M', 'tm'),
-    (0x2123, 'V'),
-    (0x2124, 'M', 'z'),
-    (0x2125, 'V'),
-    (0x2126, 'M', 'ω'),
-    (0x2127, 'V'),
-    (0x2128, 'M', 'z'),
-    (0x2129, 'V'),
-    (0x212A, 'M', 'k'),
-    (0x212B, 'M', 'Ã¥'),
-    (0x212C, 'M', 'b'),
-    (0x212D, 'M', 'c'),
-    (0x212E, 'V'),
-    (0x212F, 'M', 'e'),
-    (0x2131, 'M', 'f'),
-    (0x2132, 'X'),
-    (0x2133, 'M', 'm'),
-    (0x2134, 'M', 'o'),
-    (0x2135, 'M', '×'),
-    (0x2136, 'M', 'ב'),
-    (0x2137, 'M', '×’'),
-    (0x2138, 'M', 'ד'),
-    (0x2139, 'M', 'i'),
-    (0x213A, 'V'),
-    (0x213B, 'M', 'fax'),
-    (0x213C, 'M', 'Ï€'),
-    (0x213D, 'M', 'γ'),
-    (0x213F, 'M', 'Ï€'),
-    (0x2140, 'M', '∑'),
-    (0x2141, 'V'),
-    (0x2145, 'M', 'd'),
-    (0x2147, 'M', 'e'),
-    (0x2148, 'M', 'i'),
-    (0x2149, 'M', 'j'),
-    (0x214A, 'V'),
-    (0x2150, 'M', '1â„7'),
-    (0x2151, 'M', '1â„9'),
-    (0x2152, 'M', '1â„10'),
-    (0x2153, 'M', '1â„3'),
-    (0x2154, 'M', '2â„3'),
-    (0x2155, 'M', '1â„5'),
-    (0x2156, 'M', '2â„5'),
-    (0x2157, 'M', '3â„5'),
-    (0x2158, 'M', '4â„5'),
-    (0x2159, 'M', '1â„6'),
-    (0x215A, 'M', '5â„6'),
-    (0x215B, 'M', '1â„8'),
-    (0x215C, 'M', '3â„8'),
-    (0x215D, 'M', '5â„8'),
-    (0x215E, 'M', '7â„8'),
-    (0x215F, 'M', '1â„'),
-    (0x2160, 'M', 'i'),
-    (0x2161, 'M', 'ii'),
-    (0x2162, 'M', 'iii'),
-    (0x2163, 'M', 'iv'),
-    (0x2164, 'M', 'v'),
-    (0x2165, 'M', 'vi'),
-    (0x2166, 'M', 'vii'),
-    (0x2167, 'M', 'viii'),
-    (0x2168, 'M', 'ix'),
-    (0x2169, 'M', 'x'),
-    (0x216A, 'M', 'xi'),
-    (0x216B, 'M', 'xii'),
-    (0x216C, 'M', 'l'),
-    (0x216D, 'M', 'c'),
-    (0x216E, 'M', 'd'),
-    (0x216F, 'M', 'm'),
-    (0x2170, 'M', 'i'),
-    (0x2171, 'M', 'ii'),
-    (0x2172, 'M', 'iii'),
-    (0x2173, 'M', 'iv'),
-    (0x2174, 'M', 'v'),
-    (0x2175, 'M', 'vi'),
-    (0x2176, 'M', 'vii'),
-    (0x2177, 'M', 'viii'),
-    (0x2178, 'M', 'ix'),
-    (0x2179, 'M', 'x'),
-    (0x217A, 'M', 'xi'),
-    (0x217B, 'M', 'xii'),
-    (0x217C, 'M', 'l'),
-    ]
-
-def _seg_23() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
-    return [
-    (0x217D, 'M', 'c'),
-    (0x217E, 'M', 'd'),
-    (0x217F, 'M', 'm'),
-    (0x2180, 'V'),
-    (0x2183, 'X'),
-    (0x2184, 'V'),
-    (0x2189, 'M', '0â„3'),
-    (0x218A, 'V'),
-    (0x218C, 'X'),
-    (0x2190, 'V'),
-    (0x222C, 'M', '∫∫'),
-    (0x222D, 'M', '∫∫∫'),
-    (0x222E, 'V'),
-    (0x222F, 'M', '∮∮'),
-    (0x2230, 'M', '∮∮∮'),
-    (0x2231, 'V'),
-    (0x2260, '3'),
-    (0x2261, 'V'),
-    (0x226E, '3'),
-    (0x2270, 'V'),
-    (0x2329, 'M', '〈'),
-    (0x232A, 'M', '〉'),
-    (0x232B, 'V'),
-    (0x2427, 'X'),
-    (0x2440, 'V'),
-    (0x244B, 'X'),
-    (0x2460, 'M', '1'),
-    (0x2461, 'M', '2'),
-    (0x2462, 'M', '3'),
-    (0x2463, 'M', '4'),
-    (0x2464, 'M', '5'),
-    (0x2465, 'M', '6'),
-    (0x2466, 'M', '7'),
-    (0x2467, 'M', '8'),
-    (0x2468, 'M', '9'),
-    (0x2469, 'M', '10'),
-    (0x246A, 'M', '11'),
-    (0x246B, 'M', '12'),
-    (0x246C, 'M', '13'),
-    (0x246D, 'M', '14'),
-    (0x246E, 'M', '15'),
-    (0x246F, 'M', '16'),
-    (0x2470, 'M', '17'),
-    (0x2471, 'M', '18'),
-    (0x2472, 'M', '19'),
-    (0x2473, 'M', '20'),
-    (0x2474, '3', '(1)'),
-    (0x2475, '3', '(2)'),
-    (0x2476, '3', '(3)'),
-    (0x2477, '3', '(4)'),
-    (0x2478, '3', '(5)'),
-    (0x2479, '3', '(6)'),
-    (0x247A, '3', '(7)'),
-    (0x247B, '3', '(8)'),
-    (0x247C, '3', '(9)'),
-    (0x247D, '3', '(10)'),
-    (0x247E, '3', '(11)'),
-    (0x247F, '3', '(12)'),
-    (0x2480, '3', '(13)'),
-    (0x2481, '3', '(14)'),
-    (0x2482, '3', '(15)'),
-    (0x2483, '3', '(16)'),
-    (0x2484, '3', '(17)'),
-    (0x2485, '3', '(18)'),
-    (0x2486, '3', '(19)'),
-    (0x2487, '3', '(20)'),
-    (0x2488, 'X'),
-    (0x249C, '3', '(a)'),
-    (0x249D, '3', '(b)'),
-    (0x249E, '3', '(c)'),
-    (0x249F, '3', '(d)'),
-    (0x24A0, '3', '(e)'),
-    (0x24A1, '3', '(f)'),
-    (0x24A2, '3', '(g)'),
-    (0x24A3, '3', '(h)'),
-    (0x24A4, '3', '(i)'),
-    (0x24A5, '3', '(j)'),
-    (0x24A6, '3', '(k)'),
-    (0x24A7, '3', '(l)'),
-    (0x24A8, '3', '(m)'),
-    (0x24A9, '3', '(n)'),
-    (0x24AA, '3', '(o)'),
-    (0x24AB, '3', '(p)'),
-    (0x24AC, '3', '(q)'),
-    (0x24AD, '3', '(r)'),
-    (0x24AE, '3', '(s)'),
-    (0x24AF, '3', '(t)'),
-    (0x24B0, '3', '(u)'),
-    (0x24B1, '3', '(v)'),
-    (0x24B2, '3', '(w)'),
-    (0x24B3, '3', '(x)'),
-    (0x24B4, '3', '(y)'),
-    (0x24B5, '3', '(z)'),
-    (0x24B6, 'M', 'a'),
-    (0x24B7, 'M', 'b'),
-    (0x24B8, 'M', 'c'),
-    (0x24B9, 'M', 'd'),
-    (0x24BA, 'M', 'e'),
-    (0x24BB, 'M', 'f'),
-    (0x24BC, 'M', 'g'),
-    ]
-
-def _seg_24() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
-    return [
-    (0x24BD, 'M', 'h'),
-    (0x24BE, 'M', 'i'),
-    (0x24BF, 'M', 'j'),
-    (0x24C0, 'M', 'k'),
-    (0x24C1, 'M', 'l'),
-    (0x24C2, 'M', 'm'),
-    (0x24C3, 'M', 'n'),
-    (0x24C4, 'M', 'o'),
-    (0x24C5, 'M', 'p'),
-    (0x24C6, 'M', 'q'),
-    (0x24C7, 'M', 'r'),
-    (0x24C8, 'M', 's'),
-    (0x24C9, 'M', 't'),
-    (0x24CA, 'M', 'u'),
-    (0x24CB, 'M', 'v'),
-    (0x24CC, 'M', 'w'),
-    (0x24CD, 'M', 'x'),
-    (0x24CE, 'M', 'y'),
-    (0x24CF, 'M', 'z'),
-    (0x24D0, 'M', 'a'),
-    (0x24D1, 'M', 'b'),
-    (0x24D2, 'M', 'c'),
-    (0x24D3, 'M', 'd'),
-    (0x24D4, 'M', 'e'),
-    (0x24D5, 'M', 'f'),
-    (0x24D6, 'M', 'g'),
-    (0x24D7, 'M', 'h'),
-    (0x24D8, 'M', 'i'),
-    (0x24D9, 'M', 'j'),
-    (0x24DA, 'M', 'k'),
-    (0x24DB, 'M', 'l'),
-    (0x24DC, 'M', 'm'),
-    (0x24DD, 'M', 'n'),
-    (0x24DE, 'M', 'o'),
-    (0x24DF, 'M', 'p'),
-    (0x24E0, 'M', 'q'),
-    (0x24E1, 'M', 'r'),
-    (0x24E2, 'M', 's'),
-    (0x24E3, 'M', 't'),
-    (0x24E4, 'M', 'u'),
-    (0x24E5, 'M', 'v'),
-    (0x24E6, 'M', 'w'),
-    (0x24E7, 'M', 'x'),
-    (0x24E8, 'M', 'y'),
-    (0x24E9, 'M', 'z'),
-    (0x24EA, 'M', '0'),
-    (0x24EB, 'V'),
-    (0x2A0C, 'M', '∫∫∫∫'),
-    (0x2A0D, 'V'),
-    (0x2A74, '3', '::='),
-    (0x2A75, '3', '=='),
-    (0x2A76, '3', '==='),
-    (0x2A77, 'V'),
-    (0x2ADC, 'M', 'â«Ì¸'),
-    (0x2ADD, 'V'),
-    (0x2B74, 'X'),
-    (0x2B76, 'V'),
-    (0x2B96, 'X'),
-    (0x2B97, 'V'),
-    (0x2C00, 'M', 'â°°'),
-    (0x2C01, 'M', 'â°±'),
-    (0x2C02, 'M', 'â°²'),
-    (0x2C03, 'M', 'â°³'),
-    (0x2C04, 'M', 'â°´'),
-    (0x2C05, 'M', 'â°µ'),
-    (0x2C06, 'M', 'â°¶'),
-    (0x2C07, 'M', 'â°·'),
-    (0x2C08, 'M', 'â°¸'),
-    (0x2C09, 'M', 'â°¹'),
-    (0x2C0A, 'M', 'â°º'),
-    (0x2C0B, 'M', 'â°»'),
-    (0x2C0C, 'M', 'â°¼'),
-    (0x2C0D, 'M', 'â°½'),
-    (0x2C0E, 'M', 'â°¾'),
-    (0x2C0F, 'M', 'â°¿'),
-    (0x2C10, 'M', 'â±€'),
-    (0x2C11, 'M', 'â±'),
-    (0x2C12, 'M', 'ⱂ'),
-    (0x2C13, 'M', 'ⱃ'),
-    (0x2C14, 'M', 'ⱄ'),
-    (0x2C15, 'M', 'â±…'),
-    (0x2C16, 'M', 'ⱆ'),
-    (0x2C17, 'M', 'ⱇ'),
-    (0x2C18, 'M', 'ⱈ'),
-    (0x2C19, 'M', 'ⱉ'),
-    (0x2C1A, 'M', 'ⱊ'),
-    (0x2C1B, 'M', 'ⱋ'),
-    (0x2C1C, 'M', 'ⱌ'),
-    (0x2C1D, 'M', 'â±'),
-    (0x2C1E, 'M', 'ⱎ'),
-    (0x2C1F, 'M', 'â±'),
-    (0x2C20, 'M', 'â±'),
-    (0x2C21, 'M', 'ⱑ'),
-    (0x2C22, 'M', 'â±’'),
-    (0x2C23, 'M', 'ⱓ'),
-    (0x2C24, 'M', 'â±”'),
-    (0x2C25, 'M', 'ⱕ'),
-    (0x2C26, 'M', 'â±–'),
-    (0x2C27, 'M', 'â±—'),
-    (0x2C28, 'M', 'ⱘ'),
-    ]
-
-def _seg_25() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
-    return [
-    (0x2C29, 'M', 'â±™'),
-    (0x2C2A, 'M', 'ⱚ'),
-    (0x2C2B, 'M', 'â±›'),
-    (0x2C2C, 'M', 'ⱜ'),
-    (0x2C2D, 'M', 'â±'),
-    (0x2C2E, 'M', 'ⱞ'),
-    (0x2C2F, 'M', 'ⱟ'),
-    (0x2C30, 'V'),
-    (0x2C60, 'M', 'ⱡ'),
-    (0x2C61, 'V'),
-    (0x2C62, 'M', 'É«'),
-    (0x2C63, 'M', 'áµ½'),
-    (0x2C64, 'M', 'ɽ'),
-    (0x2C65, 'V'),
-    (0x2C67, 'M', 'ⱨ'),
-    (0x2C68, 'V'),
-    (0x2C69, 'M', 'ⱪ'),
-    (0x2C6A, 'V'),
-    (0x2C6B, 'M', 'ⱬ'),
-    (0x2C6C, 'V'),
-    (0x2C6D, 'M', 'É‘'),
-    (0x2C6E, 'M', 'ɱ'),
-    (0x2C6F, 'M', 'É'),
-    (0x2C70, 'M', 'É’'),
-    (0x2C71, 'V'),
-    (0x2C72, 'M', 'â±³'),
-    (0x2C73, 'V'),
-    (0x2C75, 'M', 'â±¶'),
-    (0x2C76, 'V'),
-    (0x2C7C, 'M', 'j'),
-    (0x2C7D, 'M', 'v'),
-    (0x2C7E, 'M', 'È¿'),
-    (0x2C7F, 'M', 'É€'),
-    (0x2C80, 'M', 'â²'),
-    (0x2C81, 'V'),
-    (0x2C82, 'M', 'ⲃ'),
-    (0x2C83, 'V'),
-    (0x2C84, 'M', 'â²…'),
-    (0x2C85, 'V'),
-    (0x2C86, 'M', 'ⲇ'),
-    (0x2C87, 'V'),
-    (0x2C88, 'M', 'ⲉ'),
-    (0x2C89, 'V'),
-    (0x2C8A, 'M', 'ⲋ'),
-    (0x2C8B, 'V'),
-    (0x2C8C, 'M', 'â²'),
-    (0x2C8D, 'V'),
-    (0x2C8E, 'M', 'â²'),
-    (0x2C8F, 'V'),
-    (0x2C90, 'M', 'ⲑ'),
-    (0x2C91, 'V'),
-    (0x2C92, 'M', 'ⲓ'),
-    (0x2C93, 'V'),
-    (0x2C94, 'M', 'ⲕ'),
-    (0x2C95, 'V'),
-    (0x2C96, 'M', 'â²—'),
-    (0x2C97, 'V'),
-    (0x2C98, 'M', 'â²™'),
-    (0x2C99, 'V'),
-    (0x2C9A, 'M', 'â²›'),
-    (0x2C9B, 'V'),
-    (0x2C9C, 'M', 'â²'),
-    (0x2C9D, 'V'),
-    (0x2C9E, 'M', 'ⲟ'),
-    (0x2C9F, 'V'),
-    (0x2CA0, 'M', 'ⲡ'),
-    (0x2CA1, 'V'),
-    (0x2CA2, 'M', 'â²£'),
-    (0x2CA3, 'V'),
-    (0x2CA4, 'M', 'â²¥'),
-    (0x2CA5, 'V'),
-    (0x2CA6, 'M', 'â²§'),
-    (0x2CA7, 'V'),
-    (0x2CA8, 'M', 'ⲩ'),
-    (0x2CA9, 'V'),
-    (0x2CAA, 'M', 'ⲫ'),
-    (0x2CAB, 'V'),
-    (0x2CAC, 'M', 'â²­'),
-    (0x2CAD, 'V'),
-    (0x2CAE, 'M', 'ⲯ'),
-    (0x2CAF, 'V'),
-    (0x2CB0, 'M', 'â²±'),
-    (0x2CB1, 'V'),
-    (0x2CB2, 'M', 'â²³'),
-    (0x2CB3, 'V'),
-    (0x2CB4, 'M', 'â²µ'),
-    (0x2CB5, 'V'),
-    (0x2CB6, 'M', 'â²·'),
-    (0x2CB7, 'V'),
-    (0x2CB8, 'M', 'â²¹'),
-    (0x2CB9, 'V'),
-    (0x2CBA, 'M', 'â²»'),
-    (0x2CBB, 'V'),
-    (0x2CBC, 'M', 'â²½'),
-    (0x2CBD, 'V'),
-    (0x2CBE, 'M', 'ⲿ'),
-    (0x2CBF, 'V'),
-    (0x2CC0, 'M', 'â³'),
-    (0x2CC1, 'V'),
-    (0x2CC2, 'M', 'ⳃ'),
-    ]
-
-def _seg_26() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
-    return [
-    (0x2CC3, 'V'),
-    (0x2CC4, 'M', 'â³…'),
-    (0x2CC5, 'V'),
-    (0x2CC6, 'M', 'ⳇ'),
-    (0x2CC7, 'V'),
-    (0x2CC8, 'M', 'ⳉ'),
-    (0x2CC9, 'V'),
-    (0x2CCA, 'M', 'ⳋ'),
-    (0x2CCB, 'V'),
-    (0x2CCC, 'M', 'â³'),
-    (0x2CCD, 'V'),
-    (0x2CCE, 'M', 'â³'),
-    (0x2CCF, 'V'),
-    (0x2CD0, 'M', 'ⳑ'),
-    (0x2CD1, 'V'),
-    (0x2CD2, 'M', 'ⳓ'),
-    (0x2CD3, 'V'),
-    (0x2CD4, 'M', 'ⳕ'),
-    (0x2CD5, 'V'),
-    (0x2CD6, 'M', 'â³—'),
-    (0x2CD7, 'V'),
-    (0x2CD8, 'M', 'â³™'),
-    (0x2CD9, 'V'),
-    (0x2CDA, 'M', 'â³›'),
-    (0x2CDB, 'V'),
-    (0x2CDC, 'M', 'â³'),
-    (0x2CDD, 'V'),
-    (0x2CDE, 'M', 'ⳟ'),
-    (0x2CDF, 'V'),
-    (0x2CE0, 'M', 'ⳡ'),
-    (0x2CE1, 'V'),
-    (0x2CE2, 'M', 'â³£'),
-    (0x2CE3, 'V'),
-    (0x2CEB, 'M', 'ⳬ'),
-    (0x2CEC, 'V'),
-    (0x2CED, 'M', 'â³®'),
-    (0x2CEE, 'V'),
-    (0x2CF2, 'M', 'â³³'),
-    (0x2CF3, 'V'),
-    (0x2CF4, 'X'),
-    (0x2CF9, 'V'),
-    (0x2D26, 'X'),
-    (0x2D27, 'V'),
-    (0x2D28, 'X'),
-    (0x2D2D, 'V'),
-    (0x2D2E, 'X'),
-    (0x2D30, 'V'),
-    (0x2D68, 'X'),
-    (0x2D6F, 'M', 'ⵡ'),
-    (0x2D70, 'V'),
-    (0x2D71, 'X'),
-    (0x2D7F, 'V'),
-    (0x2D97, 'X'),
-    (0x2DA0, 'V'),
-    (0x2DA7, 'X'),
-    (0x2DA8, 'V'),
-    (0x2DAF, 'X'),
-    (0x2DB0, 'V'),
-    (0x2DB7, 'X'),
-    (0x2DB8, 'V'),
-    (0x2DBF, 'X'),
-    (0x2DC0, 'V'),
-    (0x2DC7, 'X'),
-    (0x2DC8, 'V'),
-    (0x2DCF, 'X'),
-    (0x2DD0, 'V'),
-    (0x2DD7, 'X'),
-    (0x2DD8, 'V'),
-    (0x2DDF, 'X'),
-    (0x2DE0, 'V'),
-    (0x2E5E, 'X'),
-    (0x2E80, 'V'),
-    (0x2E9A, 'X'),
-    (0x2E9B, 'V'),
-    (0x2E9F, 'M', 'æ¯'),
-    (0x2EA0, 'V'),
-    (0x2EF3, 'M', '龟'),
-    (0x2EF4, 'X'),
-    (0x2F00, 'M', '一'),
-    (0x2F01, 'M', '丨'),
-    (0x2F02, 'M', '丶'),
-    (0x2F03, 'M', '丿'),
-    (0x2F04, 'M', 'ä¹™'),
-    (0x2F05, 'M', '亅'),
-    (0x2F06, 'M', '二'),
-    (0x2F07, 'M', '亠'),
-    (0x2F08, 'M', '人'),
-    (0x2F09, 'M', 'å„¿'),
-    (0x2F0A, 'M', 'å…¥'),
-    (0x2F0B, 'M', 'å…«'),
-    (0x2F0C, 'M', '冂'),
-    (0x2F0D, 'M', '冖'),
-    (0x2F0E, 'M', '冫'),
-    (0x2F0F, 'M', '几'),
-    (0x2F10, 'M', '凵'),
-    (0x2F11, 'M', '刀'),
-    (0x2F12, 'M', '力'),
-    (0x2F13, 'M', '勹'),
-    (0x2F14, 'M', '匕'),
-    (0x2F15, 'M', '匚'),
-    ]
-
-def _seg_27() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
-    return [
-    (0x2F16, 'M', '匸'),
-    (0x2F17, 'M', 'å'),
-    (0x2F18, 'M', 'åœ'),
-    (0x2F19, 'M', 'å©'),
-    (0x2F1A, 'M', '厂'),
-    (0x2F1B, 'M', '厶'),
-    (0x2F1C, 'M', 'åˆ'),
-    (0x2F1D, 'M', 'å£'),
-    (0x2F1E, 'M', 'å›—'),
-    (0x2F1F, 'M', '土'),
-    (0x2F20, 'M', '士'),
-    (0x2F21, 'M', '夂'),
-    (0x2F22, 'M', '夊'),
-    (0x2F23, 'M', '夕'),
-    (0x2F24, 'M', '大'),
-    (0x2F25, 'M', '女'),
-    (0x2F26, 'M', 'å­'),
-    (0x2F27, 'M', '宀'),
-    (0x2F28, 'M', '寸'),
-    (0x2F29, 'M', 'å°'),
-    (0x2F2A, 'M', 'å°¢'),
-    (0x2F2B, 'M', 'å°¸'),
-    (0x2F2C, 'M', 'å±®'),
-    (0x2F2D, 'M', 'å±±'),
-    (0x2F2E, 'M', 'å·›'),
-    (0x2F2F, 'M', 'å·¥'),
-    (0x2F30, 'M', 'å·±'),
-    (0x2F31, 'M', 'å·¾'),
-    (0x2F32, 'M', 'å¹²'),
-    (0x2F33, 'M', '幺'),
-    (0x2F34, 'M', '广'),
-    (0x2F35, 'M', 'å»´'),
-    (0x2F36, 'M', '廾'),
-    (0x2F37, 'M', '弋'),
-    (0x2F38, 'M', '弓'),
-    (0x2F39, 'M', 'å½'),
-    (0x2F3A, 'M', '彡'),
-    (0x2F3B, 'M', 'å½³'),
-    (0x2F3C, 'M', '心'),
-    (0x2F3D, 'M', '戈'),
-    (0x2F3E, 'M', '戶'),
-    (0x2F3F, 'M', '手'),
-    (0x2F40, 'M', '支'),
-    (0x2F41, 'M', 'æ”´'),
-    (0x2F42, 'M', 'æ–‡'),
-    (0x2F43, 'M', 'æ–—'),
-    (0x2F44, 'M', 'æ–¤'),
-    (0x2F45, 'M', 'æ–¹'),
-    (0x2F46, 'M', 'æ— '),
-    (0x2F47, 'M', 'æ—¥'),
-    (0x2F48, 'M', 'æ›°'),
-    (0x2F49, 'M', '月'),
-    (0x2F4A, 'M', '木'),
-    (0x2F4B, 'M', '欠'),
-    (0x2F4C, 'M', 'æ­¢'),
-    (0x2F4D, 'M', 'æ­¹'),
-    (0x2F4E, 'M', '殳'),
-    (0x2F4F, 'M', '毋'),
-    (0x2F50, 'M', '比'),
-    (0x2F51, 'M', '毛'),
-    (0x2F52, 'M', 'æ°'),
-    (0x2F53, 'M', 'æ°”'),
-    (0x2F54, 'M', 'æ°´'),
-    (0x2F55, 'M', 'ç«'),
-    (0x2F56, 'M', '爪'),
-    (0x2F57, 'M', '父'),
-    (0x2F58, 'M', '爻'),
-    (0x2F59, 'M', '爿'),
-    (0x2F5A, 'M', '片'),
-    (0x2F5B, 'M', '牙'),
-    (0x2F5C, 'M', '牛'),
-    (0x2F5D, 'M', '犬'),
-    (0x2F5E, 'M', '玄'),
-    (0x2F5F, 'M', '玉'),
-    (0x2F60, 'M', '瓜'),
-    (0x2F61, 'M', '瓦'),
-    (0x2F62, 'M', '甘'),
-    (0x2F63, 'M', '生'),
-    (0x2F64, 'M', '用'),
-    (0x2F65, 'M', 'ç”°'),
-    (0x2F66, 'M', 'ç–‹'),
-    (0x2F67, 'M', 'ç–’'),
-    (0x2F68, 'M', 'ç™¶'),
-    (0x2F69, 'M', '白'),
-    (0x2F6A, 'M', 'çš®'),
-    (0x2F6B, 'M', 'çš¿'),
-    (0x2F6C, 'M', 'ç›®'),
-    (0x2F6D, 'M', '矛'),
-    (0x2F6E, 'M', '矢'),
-    (0x2F6F, 'M', '石'),
-    (0x2F70, 'M', '示'),
-    (0x2F71, 'M', '禸'),
-    (0x2F72, 'M', '禾'),
-    (0x2F73, 'M', 'ç©´'),
-    (0x2F74, 'M', 'ç«‹'),
-    (0x2F75, 'M', '竹'),
-    (0x2F76, 'M', 'ç±³'),
-    (0x2F77, 'M', '糸'),
-    (0x2F78, 'M', 'ç¼¶'),
-    (0x2F79, 'M', '网'),
-    ]
-
-def _seg_28() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
-    return [
-    (0x2F7A, 'M', '羊'),
-    (0x2F7B, 'M', 'ç¾½'),
-    (0x2F7C, 'M', 'è€'),
-    (0x2F7D, 'M', '而'),
-    (0x2F7E, 'M', '耒'),
-    (0x2F7F, 'M', '耳'),
-    (0x2F80, 'M', 'è¿'),
-    (0x2F81, 'M', '肉'),
-    (0x2F82, 'M', '臣'),
-    (0x2F83, 'M', '自'),
-    (0x2F84, 'M', '至'),
-    (0x2F85, 'M', '臼'),
-    (0x2F86, 'M', '舌'),
-    (0x2F87, 'M', '舛'),
-    (0x2F88, 'M', '舟'),
-    (0x2F89, 'M', '艮'),
-    (0x2F8A, 'M', '色'),
-    (0x2F8B, 'M', '艸'),
-    (0x2F8C, 'M', 'è™'),
-    (0x2F8D, 'M', '虫'),
-    (0x2F8E, 'M', 'è¡€'),
-    (0x2F8F, 'M', '行'),
-    (0x2F90, 'M', 'è¡£'),
-    (0x2F91, 'M', '襾'),
-    (0x2F92, 'M', '見'),
-    (0x2F93, 'M', 'è§’'),
-    (0x2F94, 'M', '言'),
-    (0x2F95, 'M', 'è°·'),
-    (0x2F96, 'M', '豆'),
-    (0x2F97, 'M', '豕'),
-    (0x2F98, 'M', '豸'),
-    (0x2F99, 'M', 'è²'),
-    (0x2F9A, 'M', '赤'),
-    (0x2F9B, 'M', 'èµ°'),
-    (0x2F9C, 'M', 'è¶³'),
-    (0x2F9D, 'M', '身'),
-    (0x2F9E, 'M', '車'),
-    (0x2F9F, 'M', 'è¾›'),
-    (0x2FA0, 'M', 'è¾°'),
-    (0x2FA1, 'M', 'è¾µ'),
-    (0x2FA2, 'M', 'é‚‘'),
-    (0x2FA3, 'M', 'é…‰'),
-    (0x2FA4, 'M', '釆'),
-    (0x2FA5, 'M', '里'),
-    (0x2FA6, 'M', '金'),
-    (0x2FA7, 'M', 'é•·'),
-    (0x2FA8, 'M', 'é–€'),
-    (0x2FA9, 'M', '阜'),
-    (0x2FAA, 'M', 'éš¶'),
-    (0x2FAB, 'M', 'éš¹'),
-    (0x2FAC, 'M', '雨'),
-    (0x2FAD, 'M', 'é‘'),
-    (0x2FAE, 'M', 'éž'),
-    (0x2FAF, 'M', 'é¢'),
-    (0x2FB0, 'M', 'é©'),
-    (0x2FB1, 'M', '韋'),
-    (0x2FB2, 'M', '韭'),
-    (0x2FB3, 'M', '音'),
-    (0x2FB4, 'M', 'é '),
-    (0x2FB5, 'M', '風'),
-    (0x2FB6, 'M', '飛'),
-    (0x2FB7, 'M', '食'),
-    (0x2FB8, 'M', '首'),
-    (0x2FB9, 'M', '香'),
-    (0x2FBA, 'M', '馬'),
-    (0x2FBB, 'M', '骨'),
-    (0x2FBC, 'M', '高'),
-    (0x2FBD, 'M', '髟'),
-    (0x2FBE, 'M', '鬥'),
-    (0x2FBF, 'M', '鬯'),
-    (0x2FC0, 'M', '鬲'),
-    (0x2FC1, 'M', '鬼'),
-    (0x2FC2, 'M', 'é­š'),
-    (0x2FC3, 'M', 'é³¥'),
-    (0x2FC4, 'M', 'é¹µ'),
-    (0x2FC5, 'M', '鹿'),
-    (0x2FC6, 'M', '麥'),
-    (0x2FC7, 'M', '麻'),
-    (0x2FC8, 'M', '黃'),
-    (0x2FC9, 'M', 'é»'),
-    (0x2FCA, 'M', '黑'),
-    (0x2FCB, 'M', '黹'),
-    (0x2FCC, 'M', '黽'),
-    (0x2FCD, 'M', '鼎'),
-    (0x2FCE, 'M', '鼓'),
-    (0x2FCF, 'M', 'é¼ '),
-    (0x2FD0, 'M', 'é¼»'),
-    (0x2FD1, 'M', '齊'),
-    (0x2FD2, 'M', 'é½’'),
-    (0x2FD3, 'M', 'é¾'),
-    (0x2FD4, 'M', '龜'),
-    (0x2FD5, 'M', 'é¾ '),
-    (0x2FD6, 'X'),
-    (0x3000, '3', ' '),
-    (0x3001, 'V'),
-    (0x3002, 'M', '.'),
-    (0x3003, 'V'),
-    (0x3036, 'M', '〒'),
-    (0x3037, 'V'),
-    (0x3038, 'M', 'å'),
-    ]
-
-def _seg_29() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
-    return [
-    (0x3039, 'M', 'å„'),
-    (0x303A, 'M', 'å…'),
-    (0x303B, 'V'),
-    (0x3040, 'X'),
-    (0x3041, 'V'),
-    (0x3097, 'X'),
-    (0x3099, 'V'),
-    (0x309B, '3', ' ã‚™'),
-    (0x309C, '3', ' ゚'),
-    (0x309D, 'V'),
-    (0x309F, 'M', 'より'),
-    (0x30A0, 'V'),
-    (0x30FF, 'M', 'コト'),
-    (0x3100, 'X'),
-    (0x3105, 'V'),
-    (0x3130, 'X'),
-    (0x3131, 'M', 'á„€'),
-    (0x3132, 'M', 'á„'),
-    (0x3133, 'M', 'ᆪ'),
-    (0x3134, 'M', 'á„‚'),
-    (0x3135, 'M', 'ᆬ'),
-    (0x3136, 'M', 'ᆭ'),
-    (0x3137, 'M', 'ᄃ'),
-    (0x3138, 'M', 'á„„'),
-    (0x3139, 'M', 'á„…'),
-    (0x313A, 'M', 'ᆰ'),
-    (0x313B, 'M', 'ᆱ'),
-    (0x313C, 'M', 'ᆲ'),
-    (0x313D, 'M', 'ᆳ'),
-    (0x313E, 'M', 'ᆴ'),
-    (0x313F, 'M', 'ᆵ'),
-    (0x3140, 'M', 'ᄚ'),
-    (0x3141, 'M', 'ᄆ'),
-    (0x3142, 'M', 'ᄇ'),
-    (0x3143, 'M', 'ᄈ'),
-    (0x3144, 'M', 'á„¡'),
-    (0x3145, 'M', 'ᄉ'),
-    (0x3146, 'M', 'ᄊ'),
-    (0x3147, 'M', 'á„‹'),
-    (0x3148, 'M', 'ᄌ'),
-    (0x3149, 'M', 'á„'),
-    (0x314A, 'M', 'ᄎ'),
-    (0x314B, 'M', 'á„'),
-    (0x314C, 'M', 'á„'),
-    (0x314D, 'M', 'á„‘'),
-    (0x314E, 'M', 'á„’'),
-    (0x314F, 'M', 'á…¡'),
-    (0x3150, 'M', 'á…¢'),
-    (0x3151, 'M', 'á…£'),
-    (0x3152, 'M', 'á…¤'),
-    (0x3153, 'M', 'á…¥'),
-    (0x3154, 'M', 'á…¦'),
-    (0x3155, 'M', 'á…§'),
-    (0x3156, 'M', 'á…¨'),
-    (0x3157, 'M', 'á…©'),
-    (0x3158, 'M', 'á…ª'),
-    (0x3159, 'M', 'á…«'),
-    (0x315A, 'M', 'á…¬'),
-    (0x315B, 'M', 'á…­'),
-    (0x315C, 'M', 'á…®'),
-    (0x315D, 'M', 'á…¯'),
-    (0x315E, 'M', 'á…°'),
-    (0x315F, 'M', 'á…±'),
-    (0x3160, 'M', 'á…²'),
-    (0x3161, 'M', 'á…³'),
-    (0x3162, 'M', 'á…´'),
-    (0x3163, 'M', 'á…µ'),
-    (0x3164, 'X'),
-    (0x3165, 'M', 'á„”'),
-    (0x3166, 'M', 'á„•'),
-    (0x3167, 'M', 'ᇇ'),
-    (0x3168, 'M', 'ᇈ'),
-    (0x3169, 'M', 'ᇌ'),
-    (0x316A, 'M', 'ᇎ'),
-    (0x316B, 'M', 'ᇓ'),
-    (0x316C, 'M', 'ᇗ'),
-    (0x316D, 'M', 'ᇙ'),
-    (0x316E, 'M', 'ᄜ'),
-    (0x316F, 'M', 'á‡'),
-    (0x3170, 'M', 'ᇟ'),
-    (0x3171, 'M', 'á„'),
-    (0x3172, 'M', 'ᄞ'),
-    (0x3173, 'M', 'á„ '),
-    (0x3174, 'M', 'á„¢'),
-    (0x3175, 'M', 'á„£'),
-    (0x3176, 'M', 'á„§'),
-    (0x3177, 'M', 'á„©'),
-    (0x3178, 'M', 'á„«'),
-    (0x3179, 'M', 'ᄬ'),
-    (0x317A, 'M', 'á„­'),
-    (0x317B, 'M', 'á„®'),
-    (0x317C, 'M', 'ᄯ'),
-    (0x317D, 'M', 'ᄲ'),
-    (0x317E, 'M', 'á„¶'),
-    (0x317F, 'M', 'á…€'),
-    (0x3180, 'M', 'á…‡'),
-    (0x3181, 'M', 'ᅌ'),
-    (0x3182, 'M', 'ᇱ'),
-    (0x3183, 'M', 'ᇲ'),
-    (0x3184, 'M', 'á…—'),
-    ]
-
-def _seg_30() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
-    return [
-    (0x3185, 'M', 'á…˜'),
-    (0x3186, 'M', 'á…™'),
-    (0x3187, 'M', 'ᆄ'),
-    (0x3188, 'M', 'ᆅ'),
-    (0x3189, 'M', 'ᆈ'),
-    (0x318A, 'M', 'ᆑ'),
-    (0x318B, 'M', 'ᆒ'),
-    (0x318C, 'M', 'ᆔ'),
-    (0x318D, 'M', 'ᆞ'),
-    (0x318E, 'M', 'ᆡ'),
-    (0x318F, 'X'),
-    (0x3190, 'V'),
-    (0x3192, 'M', '一'),
-    (0x3193, 'M', '二'),
-    (0x3194, 'M', '三'),
-    (0x3195, 'M', 'å››'),
-    (0x3196, 'M', '上'),
-    (0x3197, 'M', '中'),
-    (0x3198, 'M', '下'),
-    (0x3199, 'M', '甲'),
-    (0x319A, 'M', 'ä¹™'),
-    (0x319B, 'M', '丙'),
-    (0x319C, 'M', 'ä¸'),
-    (0x319D, 'M', '天'),
-    (0x319E, 'M', '地'),
-    (0x319F, 'M', '人'),
-    (0x31A0, 'V'),
-    (0x31E4, 'X'),
-    (0x31F0, 'V'),
-    (0x3200, '3', '(á„€)'),
-    (0x3201, '3', '(á„‚)'),
-    (0x3202, '3', '(ᄃ)'),
-    (0x3203, '3', '(á„…)'),
-    (0x3204, '3', '(ᄆ)'),
-    (0x3205, '3', '(ᄇ)'),
-    (0x3206, '3', '(ᄉ)'),
-    (0x3207, '3', '(á„‹)'),
-    (0x3208, '3', '(ᄌ)'),
-    (0x3209, '3', '(ᄎ)'),
-    (0x320A, '3', '(á„)'),
-    (0x320B, '3', '(á„)'),
-    (0x320C, '3', '(á„‘)'),
-    (0x320D, '3', '(á„’)'),
-    (0x320E, '3', '(ê°€)'),
-    (0x320F, '3', '(나)'),
-    (0x3210, '3', '(다)'),
-    (0x3211, '3', '(ë¼)'),
-    (0x3212, '3', '(마)'),
-    (0x3213, '3', '(ë°”)'),
-    (0x3214, '3', '(사)'),
-    (0x3215, '3', '(ì•„)'),
-    (0x3216, '3', '(ìž)'),
-    (0x3217, '3', '(ì°¨)'),
-    (0x3218, '3', '(ì¹´)'),
-    (0x3219, '3', '(타)'),
-    (0x321A, '3', '(파)'),
-    (0x321B, '3', '(하)'),
-    (0x321C, '3', '(주)'),
-    (0x321D, '3', '(오전)'),
-    (0x321E, '3', '(오후)'),
-    (0x321F, 'X'),
-    (0x3220, '3', '(一)'),
-    (0x3221, '3', '(二)'),
-    (0x3222, '3', '(三)'),
-    (0x3223, '3', '(å››)'),
-    (0x3224, '3', '(五)'),
-    (0x3225, '3', '(å…­)'),
-    (0x3226, '3', '(七)'),
-    (0x3227, '3', '(å…«)'),
-    (0x3228, '3', '(ä¹)'),
-    (0x3229, '3', '(å)'),
-    (0x322A, '3', '(月)'),
-    (0x322B, '3', '(ç«)'),
-    (0x322C, '3', '(æ°´)'),
-    (0x322D, '3', '(木)'),
-    (0x322E, '3', '(金)'),
-    (0x322F, '3', '(土)'),
-    (0x3230, '3', '(æ—¥)'),
-    (0x3231, '3', '(æ ª)'),
-    (0x3232, '3', '(有)'),
-    (0x3233, '3', '(社)'),
-    (0x3234, '3', '(å)'),
-    (0x3235, '3', '(特)'),
-    (0x3236, '3', '(財)'),
-    (0x3237, '3', '(ç¥)'),
-    (0x3238, '3', '(労)'),
-    (0x3239, '3', '(代)'),
-    (0x323A, '3', '(呼)'),
-    (0x323B, '3', '(å­¦)'),
-    (0x323C, '3', '(監)'),
-    (0x323D, '3', '(ä¼)'),
-    (0x323E, '3', '(資)'),
-    (0x323F, '3', '(å”)'),
-    (0x3240, '3', '(祭)'),
-    (0x3241, '3', '(休)'),
-    (0x3242, '3', '(自)'),
-    (0x3243, '3', '(至)'),
-    (0x3244, 'M', 'å•'),
-    (0x3245, 'M', 'å¹¼'),
-    (0x3246, 'M', 'æ–‡'),
-    ]
-
-def _seg_31() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
-    return [
-    (0x3247, 'M', 'ç®'),
-    (0x3248, 'V'),
-    (0x3250, 'M', 'pte'),
-    (0x3251, 'M', '21'),
-    (0x3252, 'M', '22'),
-    (0x3253, 'M', '23'),
-    (0x3254, 'M', '24'),
-    (0x3255, 'M', '25'),
-    (0x3256, 'M', '26'),
-    (0x3257, 'M', '27'),
-    (0x3258, 'M', '28'),
-    (0x3259, 'M', '29'),
-    (0x325A, 'M', '30'),
-    (0x325B, 'M', '31'),
-    (0x325C, 'M', '32'),
-    (0x325D, 'M', '33'),
-    (0x325E, 'M', '34'),
-    (0x325F, 'M', '35'),
-    (0x3260, 'M', 'á„€'),
-    (0x3261, 'M', 'á„‚'),
-    (0x3262, 'M', 'ᄃ'),
-    (0x3263, 'M', 'á„…'),
-    (0x3264, 'M', 'ᄆ'),
-    (0x3265, 'M', 'ᄇ'),
-    (0x3266, 'M', 'ᄉ'),
-    (0x3267, 'M', 'á„‹'),
-    (0x3268, 'M', 'ᄌ'),
-    (0x3269, 'M', 'ᄎ'),
-    (0x326A, 'M', 'á„'),
-    (0x326B, 'M', 'á„'),
-    (0x326C, 'M', 'á„‘'),
-    (0x326D, 'M', 'á„’'),
-    (0x326E, 'M', 'ê°€'),
-    (0x326F, 'M', '나'),
-    (0x3270, 'M', '다'),
-    (0x3271, 'M', 'ë¼'),
-    (0x3272, 'M', '마'),
-    (0x3273, 'M', 'ë°”'),
-    (0x3274, 'M', '사'),
-    (0x3275, 'M', 'ì•„'),
-    (0x3276, 'M', 'ìž'),
-    (0x3277, 'M', 'ì°¨'),
-    (0x3278, 'M', 'ì¹´'),
-    (0x3279, 'M', '타'),
-    (0x327A, 'M', '파'),
-    (0x327B, 'M', '하'),
-    (0x327C, 'M', '참고'),
-    (0x327D, 'M', '주ì˜'),
-    (0x327E, 'M', 'ìš°'),
-    (0x327F, 'V'),
-    (0x3280, 'M', '一'),
-    (0x3281, 'M', '二'),
-    (0x3282, 'M', '三'),
-    (0x3283, 'M', 'å››'),
-    (0x3284, 'M', '五'),
-    (0x3285, 'M', 'å…­'),
-    (0x3286, 'M', '七'),
-    (0x3287, 'M', 'å…«'),
-    (0x3288, 'M', 'ä¹'),
-    (0x3289, 'M', 'å'),
-    (0x328A, 'M', '月'),
-    (0x328B, 'M', 'ç«'),
-    (0x328C, 'M', 'æ°´'),
-    (0x328D, 'M', '木'),
-    (0x328E, 'M', '金'),
-    (0x328F, 'M', '土'),
-    (0x3290, 'M', 'æ—¥'),
-    (0x3291, 'M', 'æ ª'),
-    (0x3292, 'M', '有'),
-    (0x3293, 'M', '社'),
-    (0x3294, 'M', 'å'),
-    (0x3295, 'M', '特'),
-    (0x3296, 'M', '財'),
-    (0x3297, 'M', 'ç¥'),
-    (0x3298, 'M', '労'),
-    (0x3299, 'M', '秘'),
-    (0x329A, 'M', 'ç”·'),
-    (0x329B, 'M', '女'),
-    (0x329C, 'M', 'é©'),
-    (0x329D, 'M', '優'),
-    (0x329E, 'M', 'å°'),
-    (0x329F, 'M', '注'),
-    (0x32A0, 'M', 'é …'),
-    (0x32A1, 'M', '休'),
-    (0x32A2, 'M', '写'),
-    (0x32A3, 'M', 'æ­£'),
-    (0x32A4, 'M', '上'),
-    (0x32A5, 'M', '中'),
-    (0x32A6, 'M', '下'),
-    (0x32A7, 'M', 'å·¦'),
-    (0x32A8, 'M', 'å³'),
-    (0x32A9, 'M', '医'),
-    (0x32AA, 'M', 'å®—'),
-    (0x32AB, 'M', 'å­¦'),
-    (0x32AC, 'M', '監'),
-    (0x32AD, 'M', 'ä¼'),
-    (0x32AE, 'M', '資'),
-    (0x32AF, 'M', 'å”'),
-    (0x32B0, 'M', '夜'),
-    (0x32B1, 'M', '36'),
-    ]
-
-def _seg_32() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
-    return [
-    (0x32B2, 'M', '37'),
-    (0x32B3, 'M', '38'),
-    (0x32B4, 'M', '39'),
-    (0x32B5, 'M', '40'),
-    (0x32B6, 'M', '41'),
-    (0x32B7, 'M', '42'),
-    (0x32B8, 'M', '43'),
-    (0x32B9, 'M', '44'),
-    (0x32BA, 'M', '45'),
-    (0x32BB, 'M', '46'),
-    (0x32BC, 'M', '47'),
-    (0x32BD, 'M', '48'),
-    (0x32BE, 'M', '49'),
-    (0x32BF, 'M', '50'),
-    (0x32C0, 'M', '1月'),
-    (0x32C1, 'M', '2月'),
-    (0x32C2, 'M', '3月'),
-    (0x32C3, 'M', '4月'),
-    (0x32C4, 'M', '5月'),
-    (0x32C5, 'M', '6月'),
-    (0x32C6, 'M', '7月'),
-    (0x32C7, 'M', '8月'),
-    (0x32C8, 'M', '9月'),
-    (0x32C9, 'M', '10月'),
-    (0x32CA, 'M', '11月'),
-    (0x32CB, 'M', '12月'),
-    (0x32CC, 'M', 'hg'),
-    (0x32CD, 'M', 'erg'),
-    (0x32CE, 'M', 'ev'),
-    (0x32CF, 'M', 'ltd'),
-    (0x32D0, 'M', 'ã‚¢'),
-    (0x32D1, 'M', 'イ'),
-    (0x32D2, 'M', 'ウ'),
-    (0x32D3, 'M', 'エ'),
-    (0x32D4, 'M', 'オ'),
-    (0x32D5, 'M', 'ã‚«'),
-    (0x32D6, 'M', 'ã‚­'),
-    (0x32D7, 'M', 'ク'),
-    (0x32D8, 'M', 'ケ'),
-    (0x32D9, 'M', 'コ'),
-    (0x32DA, 'M', 'サ'),
-    (0x32DB, 'M', 'ã‚·'),
-    (0x32DC, 'M', 'ス'),
-    (0x32DD, 'M', 'ã‚»'),
-    (0x32DE, 'M', 'ソ'),
-    (0x32DF, 'M', 'ã‚¿'),
-    (0x32E0, 'M', 'ãƒ'),
-    (0x32E1, 'M', 'ツ'),
-    (0x32E2, 'M', 'テ'),
-    (0x32E3, 'M', 'ト'),
-    (0x32E4, 'M', 'ナ'),
-    (0x32E5, 'M', 'ニ'),
-    (0x32E6, 'M', 'ヌ'),
-    (0x32E7, 'M', 'ãƒ'),
-    (0x32E8, 'M', 'ノ'),
-    (0x32E9, 'M', 'ãƒ'),
-    (0x32EA, 'M', 'ヒ'),
-    (0x32EB, 'M', 'フ'),
-    (0x32EC, 'M', 'ヘ'),
-    (0x32ED, 'M', 'ホ'),
-    (0x32EE, 'M', 'マ'),
-    (0x32EF, 'M', 'ミ'),
-    (0x32F0, 'M', 'ム'),
-    (0x32F1, 'M', 'メ'),
-    (0x32F2, 'M', 'モ'),
-    (0x32F3, 'M', 'ヤ'),
-    (0x32F4, 'M', 'ユ'),
-    (0x32F5, 'M', 'ヨ'),
-    (0x32F6, 'M', 'ラ'),
-    (0x32F7, 'M', 'リ'),
-    (0x32F8, 'M', 'ル'),
-    (0x32F9, 'M', 'レ'),
-    (0x32FA, 'M', 'ロ'),
-    (0x32FB, 'M', 'ワ'),
-    (0x32FC, 'M', 'ヰ'),
-    (0x32FD, 'M', 'ヱ'),
-    (0x32FE, 'M', 'ヲ'),
-    (0x32FF, 'M', '令和'),
-    (0x3300, 'M', 'アパート'),
-    (0x3301, 'M', 'アルファ'),
-    (0x3302, 'M', 'アンペア'),
-    (0x3303, 'M', 'アール'),
-    (0x3304, 'M', 'イニング'),
-    (0x3305, 'M', 'インãƒ'),
-    (0x3306, 'M', 'ウォン'),
-    (0x3307, 'M', 'エスクード'),
-    (0x3308, 'M', 'エーカー'),
-    (0x3309, 'M', 'オンス'),
-    (0x330A, 'M', 'オーム'),
-    (0x330B, 'M', 'カイリ'),
-    (0x330C, 'M', 'カラット'),
-    (0x330D, 'M', 'カロリー'),
-    (0x330E, 'M', 'ガロン'),
-    (0x330F, 'M', 'ガンマ'),
-    (0x3310, 'M', 'ギガ'),
-    (0x3311, 'M', 'ギニー'),
-    (0x3312, 'M', 'キュリー'),
-    (0x3313, 'M', 'ギルダー'),
-    (0x3314, 'M', 'キロ'),
-    (0x3315, 'M', 'キログラム'),
-    ]
-
-def _seg_33() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
-    return [
-    (0x3316, 'M', 'キロメートル'),
-    (0x3317, 'M', 'キロワット'),
-    (0x3318, 'M', 'グラム'),
-    (0x3319, 'M', 'グラムトン'),
-    (0x331A, 'M', 'クルゼイロ'),
-    (0x331B, 'M', 'クローãƒ'),
-    (0x331C, 'M', 'ケース'),
-    (0x331D, 'M', 'コルナ'),
-    (0x331E, 'M', 'コーãƒ'),
-    (0x331F, 'M', 'サイクル'),
-    (0x3320, 'M', 'サンãƒãƒ¼ãƒ '),
-    (0x3321, 'M', 'シリング'),
-    (0x3322, 'M', 'センãƒ'),
-    (0x3323, 'M', 'セント'),
-    (0x3324, 'M', 'ダース'),
-    (0x3325, 'M', 'デシ'),
-    (0x3326, 'M', 'ドル'),
-    (0x3327, 'M', 'トン'),
-    (0x3328, 'M', 'ナノ'),
-    (0x3329, 'M', 'ノット'),
-    (0x332A, 'M', 'ãƒã‚¤ãƒ„'),
-    (0x332B, 'M', 'パーセント'),
-    (0x332C, 'M', 'パーツ'),
-    (0x332D, 'M', 'ãƒãƒ¼ãƒ¬ãƒ«'),
-    (0x332E, 'M', 'ピアストル'),
-    (0x332F, 'M', 'ピクル'),
-    (0x3330, 'M', 'ピコ'),
-    (0x3331, 'M', 'ビル'),
-    (0x3332, 'M', 'ファラッド'),
-    (0x3333, 'M', 'フィート'),
-    (0x3334, 'M', 'ブッシェル'),
-    (0x3335, 'M', 'フラン'),
-    (0x3336, 'M', 'ヘクタール'),
-    (0x3337, 'M', 'ペソ'),
-    (0x3338, 'M', 'ペニヒ'),
-    (0x3339, 'M', 'ヘルツ'),
-    (0x333A, 'M', 'ペンス'),
-    (0x333B, 'M', 'ページ'),
-    (0x333C, 'M', 'ベータ'),
-    (0x333D, 'M', 'ãƒã‚¤ãƒ³ãƒˆ'),
-    (0x333E, 'M', 'ボルト'),
-    (0x333F, 'M', 'ホン'),
-    (0x3340, 'M', 'ãƒãƒ³ãƒ‰'),
-    (0x3341, 'M', 'ホール'),
-    (0x3342, 'M', 'ホーン'),
-    (0x3343, 'M', 'マイクロ'),
-    (0x3344, 'M', 'マイル'),
-    (0x3345, 'M', 'マッãƒ'),
-    (0x3346, 'M', 'マルク'),
-    (0x3347, 'M', 'マンション'),
-    (0x3348, 'M', 'ミクロン'),
-    (0x3349, 'M', 'ミリ'),
-    (0x334A, 'M', 'ミリãƒãƒ¼ãƒ«'),
-    (0x334B, 'M', 'メガ'),
-    (0x334C, 'M', 'メガトン'),
-    (0x334D, 'M', 'メートル'),
-    (0x334E, 'M', 'ヤード'),
-    (0x334F, 'M', 'ヤール'),
-    (0x3350, 'M', 'ユアン'),
-    (0x3351, 'M', 'リットル'),
-    (0x3352, 'M', 'リラ'),
-    (0x3353, 'M', 'ルピー'),
-    (0x3354, 'M', 'ルーブル'),
-    (0x3355, 'M', 'レム'),
-    (0x3356, 'M', 'レントゲン'),
-    (0x3357, 'M', 'ワット'),
-    (0x3358, 'M', '0点'),
-    (0x3359, 'M', '1点'),
-    (0x335A, 'M', '2点'),
-    (0x335B, 'M', '3点'),
-    (0x335C, 'M', '4点'),
-    (0x335D, 'M', '5点'),
-    (0x335E, 'M', '6点'),
-    (0x335F, 'M', '7点'),
-    (0x3360, 'M', '8点'),
-    (0x3361, 'M', '9点'),
-    (0x3362, 'M', '10点'),
-    (0x3363, 'M', '11点'),
-    (0x3364, 'M', '12点'),
-    (0x3365, 'M', '13点'),
-    (0x3366, 'M', '14点'),
-    (0x3367, 'M', '15点'),
-    (0x3368, 'M', '16点'),
-    (0x3369, 'M', '17点'),
-    (0x336A, 'M', '18点'),
-    (0x336B, 'M', '19点'),
-    (0x336C, 'M', '20点'),
-    (0x336D, 'M', '21点'),
-    (0x336E, 'M', '22点'),
-    (0x336F, 'M', '23点'),
-    (0x3370, 'M', '24点'),
-    (0x3371, 'M', 'hpa'),
-    (0x3372, 'M', 'da'),
-    (0x3373, 'M', 'au'),
-    (0x3374, 'M', 'bar'),
-    (0x3375, 'M', 'ov'),
-    (0x3376, 'M', 'pc'),
-    (0x3377, 'M', 'dm'),
-    (0x3378, 'M', 'dm2'),
-    (0x3379, 'M', 'dm3'),
-    ]
-
-def _seg_34() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
-    return [
-    (0x337A, 'M', 'iu'),
-    (0x337B, 'M', 'å¹³æˆ'),
-    (0x337C, 'M', '昭和'),
-    (0x337D, 'M', '大正'),
-    (0x337E, 'M', '明治'),
-    (0x337F, 'M', 'æ ªå¼ä¼šç¤¾'),
-    (0x3380, 'M', 'pa'),
-    (0x3381, 'M', 'na'),
-    (0x3382, 'M', 'μa'),
-    (0x3383, 'M', 'ma'),
-    (0x3384, 'M', 'ka'),
-    (0x3385, 'M', 'kb'),
-    (0x3386, 'M', 'mb'),
-    (0x3387, 'M', 'gb'),
-    (0x3388, 'M', 'cal'),
-    (0x3389, 'M', 'kcal'),
-    (0x338A, 'M', 'pf'),
-    (0x338B, 'M', 'nf'),
-    (0x338C, 'M', 'μf'),
-    (0x338D, 'M', 'μg'),
-    (0x338E, 'M', 'mg'),
-    (0x338F, 'M', 'kg'),
-    (0x3390, 'M', 'hz'),
-    (0x3391, 'M', 'khz'),
-    (0x3392, 'M', 'mhz'),
-    (0x3393, 'M', 'ghz'),
-    (0x3394, 'M', 'thz'),
-    (0x3395, 'M', 'μl'),
-    (0x3396, 'M', 'ml'),
-    (0x3397, 'M', 'dl'),
-    (0x3398, 'M', 'kl'),
-    (0x3399, 'M', 'fm'),
-    (0x339A, 'M', 'nm'),
-    (0x339B, 'M', 'μm'),
-    (0x339C, 'M', 'mm'),
-    (0x339D, 'M', 'cm'),
-    (0x339E, 'M', 'km'),
-    (0x339F, 'M', 'mm2'),
-    (0x33A0, 'M', 'cm2'),
-    (0x33A1, 'M', 'm2'),
-    (0x33A2, 'M', 'km2'),
-    (0x33A3, 'M', 'mm3'),
-    (0x33A4, 'M', 'cm3'),
-    (0x33A5, 'M', 'm3'),
-    (0x33A6, 'M', 'km3'),
-    (0x33A7, 'M', 'm∕s'),
-    (0x33A8, 'M', 'm∕s2'),
-    (0x33A9, 'M', 'pa'),
-    (0x33AA, 'M', 'kpa'),
-    (0x33AB, 'M', 'mpa'),
-    (0x33AC, 'M', 'gpa'),
-    (0x33AD, 'M', 'rad'),
-    (0x33AE, 'M', 'rad∕s'),
-    (0x33AF, 'M', 'rad∕s2'),
-    (0x33B0, 'M', 'ps'),
-    (0x33B1, 'M', 'ns'),
-    (0x33B2, 'M', 'μs'),
-    (0x33B3, 'M', 'ms'),
-    (0x33B4, 'M', 'pv'),
-    (0x33B5, 'M', 'nv'),
-    (0x33B6, 'M', 'μv'),
-    (0x33B7, 'M', 'mv'),
-    (0x33B8, 'M', 'kv'),
-    (0x33B9, 'M', 'mv'),
-    (0x33BA, 'M', 'pw'),
-    (0x33BB, 'M', 'nw'),
-    (0x33BC, 'M', 'μw'),
-    (0x33BD, 'M', 'mw'),
-    (0x33BE, 'M', 'kw'),
-    (0x33BF, 'M', 'mw'),
-    (0x33C0, 'M', 'kω'),
-    (0x33C1, 'M', 'mω'),
-    (0x33C2, 'X'),
-    (0x33C3, 'M', 'bq'),
-    (0x33C4, 'M', 'cc'),
-    (0x33C5, 'M', 'cd'),
-    (0x33C6, 'M', 'c∕kg'),
-    (0x33C7, 'X'),
-    (0x33C8, 'M', 'db'),
-    (0x33C9, 'M', 'gy'),
-    (0x33CA, 'M', 'ha'),
-    (0x33CB, 'M', 'hp'),
-    (0x33CC, 'M', 'in'),
-    (0x33CD, 'M', 'kk'),
-    (0x33CE, 'M', 'km'),
-    (0x33CF, 'M', 'kt'),
-    (0x33D0, 'M', 'lm'),
-    (0x33D1, 'M', 'ln'),
-    (0x33D2, 'M', 'log'),
-    (0x33D3, 'M', 'lx'),
-    (0x33D4, 'M', 'mb'),
-    (0x33D5, 'M', 'mil'),
-    (0x33D6, 'M', 'mol'),
-    (0x33D7, 'M', 'ph'),
-    (0x33D8, 'X'),
-    (0x33D9, 'M', 'ppm'),
-    (0x33DA, 'M', 'pr'),
-    (0x33DB, 'M', 'sr'),
-    (0x33DC, 'M', 'sv'),
-    (0x33DD, 'M', 'wb'),
-    ]
-
-def _seg_35() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
-    return [
-    (0x33DE, 'M', 'v∕m'),
-    (0x33DF, 'M', 'a∕m'),
-    (0x33E0, 'M', '1æ—¥'),
-    (0x33E1, 'M', '2æ—¥'),
-    (0x33E2, 'M', '3æ—¥'),
-    (0x33E3, 'M', '4æ—¥'),
-    (0x33E4, 'M', '5æ—¥'),
-    (0x33E5, 'M', '6æ—¥'),
-    (0x33E6, 'M', '7æ—¥'),
-    (0x33E7, 'M', '8æ—¥'),
-    (0x33E8, 'M', '9æ—¥'),
-    (0x33E9, 'M', '10æ—¥'),
-    (0x33EA, 'M', '11æ—¥'),
-    (0x33EB, 'M', '12æ—¥'),
-    (0x33EC, 'M', '13æ—¥'),
-    (0x33ED, 'M', '14æ—¥'),
-    (0x33EE, 'M', '15æ—¥'),
-    (0x33EF, 'M', '16æ—¥'),
-    (0x33F0, 'M', '17æ—¥'),
-    (0x33F1, 'M', '18æ—¥'),
-    (0x33F2, 'M', '19æ—¥'),
-    (0x33F3, 'M', '20æ—¥'),
-    (0x33F4, 'M', '21æ—¥'),
-    (0x33F5, 'M', '22æ—¥'),
-    (0x33F6, 'M', '23æ—¥'),
-    (0x33F7, 'M', '24æ—¥'),
-    (0x33F8, 'M', '25æ—¥'),
-    (0x33F9, 'M', '26æ—¥'),
-    (0x33FA, 'M', '27æ—¥'),
-    (0x33FB, 'M', '28æ—¥'),
-    (0x33FC, 'M', '29æ—¥'),
-    (0x33FD, 'M', '30æ—¥'),
-    (0x33FE, 'M', '31æ—¥'),
-    (0x33FF, 'M', 'gal'),
-    (0x3400, 'V'),
-    (0xA48D, 'X'),
-    (0xA490, 'V'),
-    (0xA4C7, 'X'),
-    (0xA4D0, 'V'),
-    (0xA62C, 'X'),
-    (0xA640, 'M', 'ê™'),
-    (0xA641, 'V'),
-    (0xA642, 'M', 'ꙃ'),
-    (0xA643, 'V'),
-    (0xA644, 'M', 'ê™…'),
-    (0xA645, 'V'),
-    (0xA646, 'M', 'ꙇ'),
-    (0xA647, 'V'),
-    (0xA648, 'M', 'ꙉ'),
-    (0xA649, 'V'),
-    (0xA64A, 'M', 'ꙋ'),
-    (0xA64B, 'V'),
-    (0xA64C, 'M', 'ê™'),
-    (0xA64D, 'V'),
-    (0xA64E, 'M', 'ê™'),
-    (0xA64F, 'V'),
-    (0xA650, 'M', 'ꙑ'),
-    (0xA651, 'V'),
-    (0xA652, 'M', 'ꙓ'),
-    (0xA653, 'V'),
-    (0xA654, 'M', 'ꙕ'),
-    (0xA655, 'V'),
-    (0xA656, 'M', 'ê™—'),
-    (0xA657, 'V'),
-    (0xA658, 'M', 'ê™™'),
-    (0xA659, 'V'),
-    (0xA65A, 'M', 'ê™›'),
-    (0xA65B, 'V'),
-    (0xA65C, 'M', 'ê™'),
-    (0xA65D, 'V'),
-    (0xA65E, 'M', 'ꙟ'),
-    (0xA65F, 'V'),
-    (0xA660, 'M', 'ꙡ'),
-    (0xA661, 'V'),
-    (0xA662, 'M', 'ꙣ'),
-    (0xA663, 'V'),
-    (0xA664, 'M', 'ꙥ'),
-    (0xA665, 'V'),
-    (0xA666, 'M', 'ê™§'),
-    (0xA667, 'V'),
-    (0xA668, 'M', 'ꙩ'),
-    (0xA669, 'V'),
-    (0xA66A, 'M', 'ꙫ'),
-    (0xA66B, 'V'),
-    (0xA66C, 'M', 'ê™­'),
-    (0xA66D, 'V'),
-    (0xA680, 'M', 'êš'),
-    (0xA681, 'V'),
-    (0xA682, 'M', 'ꚃ'),
-    (0xA683, 'V'),
-    (0xA684, 'M', 'êš…'),
-    (0xA685, 'V'),
-    (0xA686, 'M', 'ꚇ'),
-    (0xA687, 'V'),
-    (0xA688, 'M', 'ꚉ'),
-    (0xA689, 'V'),
-    (0xA68A, 'M', 'êš‹'),
-    (0xA68B, 'V'),
-    (0xA68C, 'M', 'êš'),
-    (0xA68D, 'V'),
-    ]
-
-def _seg_36() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
-    return [
-    (0xA68E, 'M', 'êš'),
-    (0xA68F, 'V'),
-    (0xA690, 'M', 'êš‘'),
-    (0xA691, 'V'),
-    (0xA692, 'M', 'êš“'),
-    (0xA693, 'V'),
-    (0xA694, 'M', 'êš•'),
-    (0xA695, 'V'),
-    (0xA696, 'M', 'êš—'),
-    (0xA697, 'V'),
-    (0xA698, 'M', 'êš™'),
-    (0xA699, 'V'),
-    (0xA69A, 'M', 'êš›'),
-    (0xA69B, 'V'),
-    (0xA69C, 'M', 'ÑŠ'),
-    (0xA69D, 'M', 'ь'),
-    (0xA69E, 'V'),
-    (0xA6F8, 'X'),
-    (0xA700, 'V'),
-    (0xA722, 'M', 'ꜣ'),
-    (0xA723, 'V'),
-    (0xA724, 'M', 'ꜥ'),
-    (0xA725, 'V'),
-    (0xA726, 'M', 'ꜧ'),
-    (0xA727, 'V'),
-    (0xA728, 'M', 'ꜩ'),
-    (0xA729, 'V'),
-    (0xA72A, 'M', 'ꜫ'),
-    (0xA72B, 'V'),
-    (0xA72C, 'M', 'ꜭ'),
-    (0xA72D, 'V'),
-    (0xA72E, 'M', 'ꜯ'),
-    (0xA72F, 'V'),
-    (0xA732, 'M', 'ꜳ'),
-    (0xA733, 'V'),
-    (0xA734, 'M', 'ꜵ'),
-    (0xA735, 'V'),
-    (0xA736, 'M', 'ꜷ'),
-    (0xA737, 'V'),
-    (0xA738, 'M', 'ꜹ'),
-    (0xA739, 'V'),
-    (0xA73A, 'M', 'ꜻ'),
-    (0xA73B, 'V'),
-    (0xA73C, 'M', 'ꜽ'),
-    (0xA73D, 'V'),
-    (0xA73E, 'M', 'ꜿ'),
-    (0xA73F, 'V'),
-    (0xA740, 'M', 'ê'),
-    (0xA741, 'V'),
-    (0xA742, 'M', 'êƒ'),
-    (0xA743, 'V'),
-    (0xA744, 'M', 'ê…'),
-    (0xA745, 'V'),
-    (0xA746, 'M', 'ê‡'),
-    (0xA747, 'V'),
-    (0xA748, 'M', 'ê‰'),
-    (0xA749, 'V'),
-    (0xA74A, 'M', 'ê‹'),
-    (0xA74B, 'V'),
-    (0xA74C, 'M', 'ê'),
-    (0xA74D, 'V'),
-    (0xA74E, 'M', 'ê'),
-    (0xA74F, 'V'),
-    (0xA750, 'M', 'ê‘'),
-    (0xA751, 'V'),
-    (0xA752, 'M', 'ê“'),
-    (0xA753, 'V'),
-    (0xA754, 'M', 'ê•'),
-    (0xA755, 'V'),
-    (0xA756, 'M', 'ê—'),
-    (0xA757, 'V'),
-    (0xA758, 'M', 'ê™'),
-    (0xA759, 'V'),
-    (0xA75A, 'M', 'ê›'),
-    (0xA75B, 'V'),
-    (0xA75C, 'M', 'ê'),
-    (0xA75D, 'V'),
-    (0xA75E, 'M', 'êŸ'),
-    (0xA75F, 'V'),
-    (0xA760, 'M', 'ê¡'),
-    (0xA761, 'V'),
-    (0xA762, 'M', 'ê£'),
-    (0xA763, 'V'),
-    (0xA764, 'M', 'ê¥'),
-    (0xA765, 'V'),
-    (0xA766, 'M', 'ê§'),
-    (0xA767, 'V'),
-    (0xA768, 'M', 'ê©'),
-    (0xA769, 'V'),
-    (0xA76A, 'M', 'ê«'),
-    (0xA76B, 'V'),
-    (0xA76C, 'M', 'ê­'),
-    (0xA76D, 'V'),
-    (0xA76E, 'M', 'ê¯'),
-    (0xA76F, 'V'),
-    (0xA770, 'M', 'ê¯'),
-    (0xA771, 'V'),
-    (0xA779, 'M', 'êº'),
-    (0xA77A, 'V'),
-    (0xA77B, 'M', 'ê¼'),
-    ]
-
-def _seg_37() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
-    return [
-    (0xA77C, 'V'),
-    (0xA77D, 'M', 'áµ¹'),
-    (0xA77E, 'M', 'ê¿'),
-    (0xA77F, 'V'),
-    (0xA780, 'M', 'êž'),
-    (0xA781, 'V'),
-    (0xA782, 'M', 'ꞃ'),
-    (0xA783, 'V'),
-    (0xA784, 'M', 'êž…'),
-    (0xA785, 'V'),
-    (0xA786, 'M', 'ꞇ'),
-    (0xA787, 'V'),
-    (0xA78B, 'M', 'ꞌ'),
-    (0xA78C, 'V'),
-    (0xA78D, 'M', 'É¥'),
-    (0xA78E, 'V'),
-    (0xA790, 'M', 'êž‘'),
-    (0xA791, 'V'),
-    (0xA792, 'M', 'êž“'),
-    (0xA793, 'V'),
-    (0xA796, 'M', 'êž—'),
-    (0xA797, 'V'),
-    (0xA798, 'M', 'êž™'),
-    (0xA799, 'V'),
-    (0xA79A, 'M', 'êž›'),
-    (0xA79B, 'V'),
-    (0xA79C, 'M', 'êž'),
-    (0xA79D, 'V'),
-    (0xA79E, 'M', 'ꞟ'),
-    (0xA79F, 'V'),
-    (0xA7A0, 'M', 'êž¡'),
-    (0xA7A1, 'V'),
-    (0xA7A2, 'M', 'ꞣ'),
-    (0xA7A3, 'V'),
-    (0xA7A4, 'M', 'ꞥ'),
-    (0xA7A5, 'V'),
-    (0xA7A6, 'M', 'êž§'),
-    (0xA7A7, 'V'),
-    (0xA7A8, 'M', 'êž©'),
-    (0xA7A9, 'V'),
-    (0xA7AA, 'M', 'ɦ'),
-    (0xA7AB, 'M', 'ɜ'),
-    (0xA7AC, 'M', 'É¡'),
-    (0xA7AD, 'M', 'ɬ'),
-    (0xA7AE, 'M', 'ɪ'),
-    (0xA7AF, 'V'),
-    (0xA7B0, 'M', 'Êž'),
-    (0xA7B1, 'M', 'ʇ'),
-    (0xA7B2, 'M', 'Ê'),
-    (0xA7B3, 'M', 'ê­“'),
-    (0xA7B4, 'M', 'êžµ'),
-    (0xA7B5, 'V'),
-    (0xA7B6, 'M', 'êž·'),
-    (0xA7B7, 'V'),
-    (0xA7B8, 'M', 'êž¹'),
-    (0xA7B9, 'V'),
-    (0xA7BA, 'M', 'êž»'),
-    (0xA7BB, 'V'),
-    (0xA7BC, 'M', 'êž½'),
-    (0xA7BD, 'V'),
-    (0xA7BE, 'M', 'êž¿'),
-    (0xA7BF, 'V'),
-    (0xA7C0, 'M', 'êŸ'),
-    (0xA7C1, 'V'),
-    (0xA7C2, 'M', 'ꟃ'),
-    (0xA7C3, 'V'),
-    (0xA7C4, 'M', 'êž”'),
-    (0xA7C5, 'M', 'Ê‚'),
-    (0xA7C6, 'M', 'á¶Ž'),
-    (0xA7C7, 'M', 'ꟈ'),
-    (0xA7C8, 'V'),
-    (0xA7C9, 'M', 'ꟊ'),
-    (0xA7CA, 'V'),
-    (0xA7CB, 'X'),
-    (0xA7D0, 'M', 'ꟑ'),
-    (0xA7D1, 'V'),
-    (0xA7D2, 'X'),
-    (0xA7D3, 'V'),
-    (0xA7D4, 'X'),
-    (0xA7D5, 'V'),
-    (0xA7D6, 'M', 'ꟗ'),
-    (0xA7D7, 'V'),
-    (0xA7D8, 'M', 'ꟙ'),
-    (0xA7D9, 'V'),
-    (0xA7DA, 'X'),
-    (0xA7F2, 'M', 'c'),
-    (0xA7F3, 'M', 'f'),
-    (0xA7F4, 'M', 'q'),
-    (0xA7F5, 'M', 'ꟶ'),
-    (0xA7F6, 'V'),
-    (0xA7F8, 'M', 'ħ'),
-    (0xA7F9, 'M', 'Å“'),
-    (0xA7FA, 'V'),
-    (0xA82D, 'X'),
-    (0xA830, 'V'),
-    (0xA83A, 'X'),
-    (0xA840, 'V'),
-    (0xA878, 'X'),
-    (0xA880, 'V'),
-    (0xA8C6, 'X'),
-    ]
-
-def _seg_38() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
-    return [
-    (0xA8CE, 'V'),
-    (0xA8DA, 'X'),
-    (0xA8E0, 'V'),
-    (0xA954, 'X'),
-    (0xA95F, 'V'),
-    (0xA97D, 'X'),
-    (0xA980, 'V'),
-    (0xA9CE, 'X'),
-    (0xA9CF, 'V'),
-    (0xA9DA, 'X'),
-    (0xA9DE, 'V'),
-    (0xA9FF, 'X'),
-    (0xAA00, 'V'),
-    (0xAA37, 'X'),
-    (0xAA40, 'V'),
-    (0xAA4E, 'X'),
-    (0xAA50, 'V'),
-    (0xAA5A, 'X'),
-    (0xAA5C, 'V'),
-    (0xAAC3, 'X'),
-    (0xAADB, 'V'),
-    (0xAAF7, 'X'),
-    (0xAB01, 'V'),
-    (0xAB07, 'X'),
-    (0xAB09, 'V'),
-    (0xAB0F, 'X'),
-    (0xAB11, 'V'),
-    (0xAB17, 'X'),
-    (0xAB20, 'V'),
-    (0xAB27, 'X'),
-    (0xAB28, 'V'),
-    (0xAB2F, 'X'),
-    (0xAB30, 'V'),
-    (0xAB5C, 'M', 'ꜧ'),
-    (0xAB5D, 'M', 'ꬷ'),
-    (0xAB5E, 'M', 'É«'),
-    (0xAB5F, 'M', 'ê­’'),
-    (0xAB60, 'V'),
-    (0xAB69, 'M', 'Ê'),
-    (0xAB6A, 'V'),
-    (0xAB6C, 'X'),
-    (0xAB70, 'M', 'Ꭰ'),
-    (0xAB71, 'M', 'Ꭱ'),
-    (0xAB72, 'M', 'Ꭲ'),
-    (0xAB73, 'M', 'Ꭳ'),
-    (0xAB74, 'M', 'Ꭴ'),
-    (0xAB75, 'M', 'Ꭵ'),
-    (0xAB76, 'M', 'Ꭶ'),
-    (0xAB77, 'M', 'Ꭷ'),
-    (0xAB78, 'M', 'Ꭸ'),
-    (0xAB79, 'M', 'Ꭹ'),
-    (0xAB7A, 'M', 'Ꭺ'),
-    (0xAB7B, 'M', 'Ꭻ'),
-    (0xAB7C, 'M', 'Ꭼ'),
-    (0xAB7D, 'M', 'Ꭽ'),
-    (0xAB7E, 'M', 'Ꭾ'),
-    (0xAB7F, 'M', 'Ꭿ'),
-    (0xAB80, 'M', 'Ꮀ'),
-    (0xAB81, 'M', 'Ꮁ'),
-    (0xAB82, 'M', 'Ꮂ'),
-    (0xAB83, 'M', 'Ꮃ'),
-    (0xAB84, 'M', 'Ꮄ'),
-    (0xAB85, 'M', 'Ꮅ'),
-    (0xAB86, 'M', 'Ꮆ'),
-    (0xAB87, 'M', 'Ꮇ'),
-    (0xAB88, 'M', 'Ꮈ'),
-    (0xAB89, 'M', 'Ꮉ'),
-    (0xAB8A, 'M', 'Ꮊ'),
-    (0xAB8B, 'M', 'Ꮋ'),
-    (0xAB8C, 'M', 'Ꮌ'),
-    (0xAB8D, 'M', 'Ꮍ'),
-    (0xAB8E, 'M', 'Ꮎ'),
-    (0xAB8F, 'M', 'Ꮏ'),
-    (0xAB90, 'M', 'á€'),
-    (0xAB91, 'M', 'á'),
-    (0xAB92, 'M', 'á‚'),
-    (0xAB93, 'M', 'áƒ'),
-    (0xAB94, 'M', 'á„'),
-    (0xAB95, 'M', 'á…'),
-    (0xAB96, 'M', 'á†'),
-    (0xAB97, 'M', 'á‡'),
-    (0xAB98, 'M', 'áˆ'),
-    (0xAB99, 'M', 'á‰'),
-    (0xAB9A, 'M', 'áŠ'),
-    (0xAB9B, 'M', 'á‹'),
-    (0xAB9C, 'M', 'áŒ'),
-    (0xAB9D, 'M', 'á'),
-    (0xAB9E, 'M', 'áŽ'),
-    (0xAB9F, 'M', 'á'),
-    (0xABA0, 'M', 'á'),
-    (0xABA1, 'M', 'á‘'),
-    (0xABA2, 'M', 'á’'),
-    (0xABA3, 'M', 'á“'),
-    (0xABA4, 'M', 'á”'),
-    (0xABA5, 'M', 'á•'),
-    (0xABA6, 'M', 'á–'),
-    (0xABA7, 'M', 'á—'),
-    (0xABA8, 'M', 'á˜'),
-    (0xABA9, 'M', 'á™'),
-    (0xABAA, 'M', 'áš'),
-    ]
-
-def _seg_39() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
-    return [
-    (0xABAB, 'M', 'á›'),
-    (0xABAC, 'M', 'áœ'),
-    (0xABAD, 'M', 'á'),
-    (0xABAE, 'M', 'áž'),
-    (0xABAF, 'M', 'áŸ'),
-    (0xABB0, 'M', 'á '),
-    (0xABB1, 'M', 'á¡'),
-    (0xABB2, 'M', 'á¢'),
-    (0xABB3, 'M', 'á£'),
-    (0xABB4, 'M', 'á¤'),
-    (0xABB5, 'M', 'á¥'),
-    (0xABB6, 'M', 'á¦'),
-    (0xABB7, 'M', 'á§'),
-    (0xABB8, 'M', 'á¨'),
-    (0xABB9, 'M', 'á©'),
-    (0xABBA, 'M', 'áª'),
-    (0xABBB, 'M', 'á«'),
-    (0xABBC, 'M', 'á¬'),
-    (0xABBD, 'M', 'á­'),
-    (0xABBE, 'M', 'á®'),
-    (0xABBF, 'M', 'á¯'),
-    (0xABC0, 'V'),
-    (0xABEE, 'X'),
-    (0xABF0, 'V'),
-    (0xABFA, 'X'),
-    (0xAC00, 'V'),
-    (0xD7A4, 'X'),
-    (0xD7B0, 'V'),
-    (0xD7C7, 'X'),
-    (0xD7CB, 'V'),
-    (0xD7FC, 'X'),
-    (0xF900, 'M', '豈'),
-    (0xF901, 'M', 'æ›´'),
-    (0xF902, 'M', '車'),
-    (0xF903, 'M', '賈'),
-    (0xF904, 'M', '滑'),
-    (0xF905, 'M', '串'),
-    (0xF906, 'M', 'å¥'),
-    (0xF907, 'M', '龜'),
-    (0xF909, 'M', '契'),
-    (0xF90A, 'M', '金'),
-    (0xF90B, 'M', 'å–‡'),
-    (0xF90C, 'M', '奈'),
-    (0xF90D, 'M', '懶'),
-    (0xF90E, 'M', '癩'),
-    (0xF90F, 'M', 'ç¾…'),
-    (0xF910, 'M', '蘿'),
-    (0xF911, 'M', '螺'),
-    (0xF912, 'M', '裸'),
-    (0xF913, 'M', 'é‚'),
-    (0xF914, 'M', '樂'),
-    (0xF915, 'M', 'æ´›'),
-    (0xF916, 'M', '烙'),
-    (0xF917, 'M', 'çž'),
-    (0xF918, 'M', 'è½'),
-    (0xF919, 'M', 'é…ª'),
-    (0xF91A, 'M', 'é§±'),
-    (0xF91B, 'M', '亂'),
-    (0xF91C, 'M', 'åµ'),
-    (0xF91D, 'M', '欄'),
-    (0xF91E, 'M', '爛'),
-    (0xF91F, 'M', '蘭'),
-    (0xF920, 'M', '鸞'),
-    (0xF921, 'M', 'åµ'),
-    (0xF922, 'M', 'æ¿«'),
-    (0xF923, 'M', 'è—'),
-    (0xF924, 'M', '襤'),
-    (0xF925, 'M', '拉'),
-    (0xF926, 'M', '臘'),
-    (0xF927, 'M', 'è Ÿ'),
-    (0xF928, 'M', '廊'),
-    (0xF929, 'M', '朗'),
-    (0xF92A, 'M', '浪'),
-    (0xF92B, 'M', '狼'),
-    (0xF92C, 'M', '郎'),
-    (0xF92D, 'M', '來'),
-    (0xF92E, 'M', '冷'),
-    (0xF92F, 'M', '勞'),
-    (0xF930, 'M', 'æ“„'),
-    (0xF931, 'M', 'æ«“'),
-    (0xF932, 'M', 'çˆ'),
-    (0xF933, 'M', 'ç›§'),
-    (0xF934, 'M', 'è€'),
-    (0xF935, 'M', '蘆'),
-    (0xF936, 'M', '虜'),
-    (0xF937, 'M', 'è·¯'),
-    (0xF938, 'M', '露'),
-    (0xF939, 'M', 'é­¯'),
-    (0xF93A, 'M', 'é·º'),
-    (0xF93B, 'M', '碌'),
-    (0xF93C, 'M', '祿'),
-    (0xF93D, 'M', 'ç¶ '),
-    (0xF93E, 'M', 'è‰'),
-    (0xF93F, 'M', '錄'),
-    (0xF940, 'M', '鹿'),
-    (0xF941, 'M', 'è«–'),
-    (0xF942, 'M', '壟'),
-    (0xF943, 'M', '弄'),
-    (0xF944, 'M', 'ç± '),
-    (0xF945, 'M', 'è¾'),
-    ]
-
-def _seg_40() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
-    return [
-    (0xF946, 'M', '牢'),
-    (0xF947, 'M', '磊'),
-    (0xF948, 'M', '賂'),
-    (0xF949, 'M', 'é›·'),
-    (0xF94A, 'M', '壘'),
-    (0xF94B, 'M', 'å±¢'),
-    (0xF94C, 'M', '樓'),
-    (0xF94D, 'M', 'æ·š'),
-    (0xF94E, 'M', 'æ¼'),
-    (0xF94F, 'M', 'ç´¯'),
-    (0xF950, 'M', '縷'),
-    (0xF951, 'M', '陋'),
-    (0xF952, 'M', 'å‹’'),
-    (0xF953, 'M', 'è‚‹'),
-    (0xF954, 'M', '凜'),
-    (0xF955, 'M', '凌'),
-    (0xF956, 'M', '稜'),
-    (0xF957, 'M', 'ç¶¾'),
-    (0xF958, 'M', 'è±'),
-    (0xF959, 'M', '陵'),
-    (0xF95A, 'M', '讀'),
-    (0xF95B, 'M', 'æ‹'),
-    (0xF95C, 'M', '樂'),
-    (0xF95D, 'M', '諾'),
-    (0xF95E, 'M', '丹'),
-    (0xF95F, 'M', '寧'),
-    (0xF960, 'M', '怒'),
-    (0xF961, 'M', '率'),
-    (0xF962, 'M', 'ç•°'),
-    (0xF963, 'M', '北'),
-    (0xF964, 'M', '磻'),
-    (0xF965, 'M', '便'),
-    (0xF966, 'M', '復'),
-    (0xF967, 'M', 'ä¸'),
-    (0xF968, 'M', '泌'),
-    (0xF969, 'M', '數'),
-    (0xF96A, 'M', 'ç´¢'),
-    (0xF96B, 'M', 'åƒ'),
-    (0xF96C, 'M', '塞'),
-    (0xF96D, 'M', 'çœ'),
-    (0xF96E, 'M', '葉'),
-    (0xF96F, 'M', '說'),
-    (0xF970, 'M', '殺'),
-    (0xF971, 'M', 'è¾°'),
-    (0xF972, 'M', '沈'),
-    (0xF973, 'M', '拾'),
-    (0xF974, 'M', 'è‹¥'),
-    (0xF975, 'M', '掠'),
-    (0xF976, 'M', 'ç•¥'),
-    (0xF977, 'M', '亮'),
-    (0xF978, 'M', 'å…©'),
-    (0xF979, 'M', '凉'),
-    (0xF97A, 'M', 'æ¢'),
-    (0xF97B, 'M', 'ç³§'),
-    (0xF97C, 'M', '良'),
-    (0xF97D, 'M', 'è«’'),
-    (0xF97E, 'M', 'é‡'),
-    (0xF97F, 'M', '勵'),
-    (0xF980, 'M', 'å‘‚'),
-    (0xF981, 'M', '女'),
-    (0xF982, 'M', '廬'),
-    (0xF983, 'M', 'æ—…'),
-    (0xF984, 'M', '濾'),
-    (0xF985, 'M', '礪'),
-    (0xF986, 'M', 'é–­'),
-    (0xF987, 'M', '驪'),
-    (0xF988, 'M', '麗'),
-    (0xF989, 'M', '黎'),
-    (0xF98A, 'M', '力'),
-    (0xF98B, 'M', '曆'),
-    (0xF98C, 'M', 'æ­·'),
-    (0xF98D, 'M', 'è½¢'),
-    (0xF98E, 'M', 'å¹´'),
-    (0xF98F, 'M', 'æ†'),
-    (0xF990, 'M', '戀'),
-    (0xF991, 'M', 'æ’š'),
-    (0xF992, 'M', 'æ¼£'),
-    (0xF993, 'M', 'ç…‰'),
-    (0xF994, 'M', 'ç’‰'),
-    (0xF995, 'M', 'ç§Š'),
-    (0xF996, 'M', 'ç·´'),
-    (0xF997, 'M', 'è¯'),
-    (0xF998, 'M', '輦'),
-    (0xF999, 'M', 'è“®'),
-    (0xF99A, 'M', '連'),
-    (0xF99B, 'M', 'éŠ'),
-    (0xF99C, 'M', '列'),
-    (0xF99D, 'M', '劣'),
-    (0xF99E, 'M', 'å’½'),
-    (0xF99F, 'M', '烈'),
-    (0xF9A0, 'M', '裂'),
-    (0xF9A1, 'M', '說'),
-    (0xF9A2, 'M', '廉'),
-    (0xF9A3, 'M', '念'),
-    (0xF9A4, 'M', 'æ»'),
-    (0xF9A5, 'M', 'æ®®'),
-    (0xF9A6, 'M', 'ç°¾'),
-    (0xF9A7, 'M', 'çµ'),
-    (0xF9A8, 'M', '令'),
-    (0xF9A9, 'M', '囹'),
-    ]
-
-def _seg_41() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
-    return [
-    (0xF9AA, 'M', '寧'),
-    (0xF9AB, 'M', '嶺'),
-    (0xF9AC, 'M', '怜'),
-    (0xF9AD, 'M', '玲'),
-    (0xF9AE, 'M', 'ç‘©'),
-    (0xF9AF, 'M', '羚'),
-    (0xF9B0, 'M', 'è†'),
-    (0xF9B1, 'M', '鈴'),
-    (0xF9B2, 'M', 'é›¶'),
-    (0xF9B3, 'M', 'éˆ'),
-    (0xF9B4, 'M', 'é ˜'),
-    (0xF9B5, 'M', '例'),
-    (0xF9B6, 'M', '禮'),
-    (0xF9B7, 'M', '醴'),
-    (0xF9B8, 'M', '隸'),
-    (0xF9B9, 'M', '惡'),
-    (0xF9BA, 'M', '了'),
-    (0xF9BB, 'M', '僚'),
-    (0xF9BC, 'M', '寮'),
-    (0xF9BD, 'M', 'å°¿'),
-    (0xF9BE, 'M', 'æ–™'),
-    (0xF9BF, 'M', '樂'),
-    (0xF9C0, 'M', '燎'),
-    (0xF9C1, 'M', '療'),
-    (0xF9C2, 'M', '蓼'),
-    (0xF9C3, 'M', 'é¼'),
-    (0xF9C4, 'M', 'é¾'),
-    (0xF9C5, 'M', '暈'),
-    (0xF9C6, 'M', '阮'),
-    (0xF9C7, 'M', '劉'),
-    (0xF9C8, 'M', 'æ»'),
-    (0xF9C9, 'M', '柳'),
-    (0xF9CA, 'M', 'æµ'),
-    (0xF9CB, 'M', '溜'),
-    (0xF9CC, 'M', 'ç‰'),
-    (0xF9CD, 'M', 'ç•™'),
-    (0xF9CE, 'M', 'ç¡«'),
-    (0xF9CF, 'M', 'ç´'),
-    (0xF9D0, 'M', '類'),
-    (0xF9D1, 'M', 'å…­'),
-    (0xF9D2, 'M', '戮'),
-    (0xF9D3, 'M', '陸'),
-    (0xF9D4, 'M', '倫'),
-    (0xF9D5, 'M', 'å´™'),
-    (0xF9D6, 'M', 'æ·ª'),
-    (0xF9D7, 'M', '輪'),
-    (0xF9D8, 'M', '律'),
-    (0xF9D9, 'M', 'æ…„'),
-    (0xF9DA, 'M', 'æ —'),
-    (0xF9DB, 'M', '率'),
-    (0xF9DC, 'M', '隆'),
-    (0xF9DD, 'M', '利'),
-    (0xF9DE, 'M', 'å'),
-    (0xF9DF, 'M', 'å±¥'),
-    (0xF9E0, 'M', '易'),
-    (0xF9E1, 'M', 'æŽ'),
-    (0xF9E2, 'M', '梨'),
-    (0xF9E3, 'M', 'æ³¥'),
-    (0xF9E4, 'M', 'ç†'),
-    (0xF9E5, 'M', 'ç—¢'),
-    (0xF9E6, 'M', 'ç½¹'),
-    (0xF9E7, 'M', 'è£'),
-    (0xF9E8, 'M', '裡'),
-    (0xF9E9, 'M', '里'),
-    (0xF9EA, 'M', '離'),
-    (0xF9EB, 'M', '匿'),
-    (0xF9EC, 'M', '溺'),
-    (0xF9ED, 'M', 'å'),
-    (0xF9EE, 'M', 'ç‡'),
-    (0xF9EF, 'M', 'ç’˜'),
-    (0xF9F0, 'M', 'è—º'),
-    (0xF9F1, 'M', '隣'),
-    (0xF9F2, 'M', 'é±—'),
-    (0xF9F3, 'M', '麟'),
-    (0xF9F4, 'M', 'æž—'),
-    (0xF9F5, 'M', 'æ·‹'),
-    (0xF9F6, 'M', '臨'),
-    (0xF9F7, 'M', 'ç«‹'),
-    (0xF9F8, 'M', '笠'),
-    (0xF9F9, 'M', 'ç²’'),
-    (0xF9FA, 'M', 'ç‹€'),
-    (0xF9FB, 'M', 'ç‚™'),
-    (0xF9FC, 'M', 'è­˜'),
-    (0xF9FD, 'M', '什'),
-    (0xF9FE, 'M', '茶'),
-    (0xF9FF, 'M', '刺'),
-    (0xFA00, 'M', '切'),
-    (0xFA01, 'M', '度'),
-    (0xFA02, 'M', 'æ‹“'),
-    (0xFA03, 'M', 'ç³–'),
-    (0xFA04, 'M', 'å®…'),
-    (0xFA05, 'M', 'æ´ž'),
-    (0xFA06, 'M', 'æš´'),
-    (0xFA07, 'M', 'è¼»'),
-    (0xFA08, 'M', '行'),
-    (0xFA09, 'M', 'é™'),
-    (0xFA0A, 'M', '見'),
-    (0xFA0B, 'M', '廓'),
-    (0xFA0C, 'M', 'å…€'),
-    (0xFA0D, 'M', 'å—€'),
-    ]
-
-def _seg_42() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
-    return [
-    (0xFA0E, 'V'),
-    (0xFA10, 'M', '塚'),
-    (0xFA11, 'V'),
-    (0xFA12, 'M', 'æ™´'),
-    (0xFA13, 'V'),
-    (0xFA15, 'M', '凞'),
-    (0xFA16, 'M', '猪'),
-    (0xFA17, 'M', '益'),
-    (0xFA18, 'M', '礼'),
-    (0xFA19, 'M', '神'),
-    (0xFA1A, 'M', '祥'),
-    (0xFA1B, 'M', 'ç¦'),
-    (0xFA1C, 'M', 'é–'),
-    (0xFA1D, 'M', 'ç²¾'),
-    (0xFA1E, 'M', 'ç¾½'),
-    (0xFA1F, 'V'),
-    (0xFA20, 'M', '蘒'),
-    (0xFA21, 'V'),
-    (0xFA22, 'M', '諸'),
-    (0xFA23, 'V'),
-    (0xFA25, 'M', '逸'),
-    (0xFA26, 'M', '都'),
-    (0xFA27, 'V'),
-    (0xFA2A, 'M', '飯'),
-    (0xFA2B, 'M', '飼'),
-    (0xFA2C, 'M', '館'),
-    (0xFA2D, 'M', 'é¶´'),
-    (0xFA2E, 'M', '郞'),
-    (0xFA2F, 'M', 'éš·'),
-    (0xFA30, 'M', 'ä¾®'),
-    (0xFA31, 'M', '僧'),
-    (0xFA32, 'M', 'å…'),
-    (0xFA33, 'M', '勉'),
-    (0xFA34, 'M', '勤'),
-    (0xFA35, 'M', 'å‘'),
-    (0xFA36, 'M', 'å–'),
-    (0xFA37, 'M', '嘆'),
-    (0xFA38, 'M', '器'),
-    (0xFA39, 'M', 'å¡€'),
-    (0xFA3A, 'M', '墨'),
-    (0xFA3B, 'M', '層'),
-    (0xFA3C, 'M', 'å±®'),
-    (0xFA3D, 'M', 'æ‚”'),
-    (0xFA3E, 'M', 'æ…¨'),
-    (0xFA3F, 'M', '憎'),
-    (0xFA40, 'M', '懲'),
-    (0xFA41, 'M', 'æ•'),
-    (0xFA42, 'M', 'æ—¢'),
-    (0xFA43, 'M', 'æš‘'),
-    (0xFA44, 'M', '梅'),
-    (0xFA45, 'M', 'æµ·'),
-    (0xFA46, 'M', '渚'),
-    (0xFA47, 'M', 'æ¼¢'),
-    (0xFA48, 'M', 'ç…®'),
-    (0xFA49, 'M', '爫'),
-    (0xFA4A, 'M', 'ç¢'),
-    (0xFA4B, 'M', '碑'),
-    (0xFA4C, 'M', '社'),
-    (0xFA4D, 'M', '祉'),
-    (0xFA4E, 'M', '祈'),
-    (0xFA4F, 'M', 'ç¥'),
-    (0xFA50, 'M', '祖'),
-    (0xFA51, 'M', 'ç¥'),
-    (0xFA52, 'M', 'ç¦'),
-    (0xFA53, 'M', '禎'),
-    (0xFA54, 'M', 'ç©€'),
-    (0xFA55, 'M', 'çª'),
-    (0xFA56, 'M', '節'),
-    (0xFA57, 'M', 'ç·´'),
-    (0xFA58, 'M', '縉'),
-    (0xFA59, 'M', 'ç¹'),
-    (0xFA5A, 'M', 'ç½²'),
-    (0xFA5B, 'M', '者'),
-    (0xFA5C, 'M', '臭'),
-    (0xFA5D, 'M', '艹'),
-    (0xFA5F, 'M', 'è‘—'),
-    (0xFA60, 'M', 'è¤'),
-    (0xFA61, 'M', '視'),
-    (0xFA62, 'M', 'è¬'),
-    (0xFA63, 'M', '謹'),
-    (0xFA64, 'M', '賓'),
-    (0xFA65, 'M', 'è´ˆ'),
-    (0xFA66, 'M', 'è¾¶'),
-    (0xFA67, 'M', '逸'),
-    (0xFA68, 'M', '難'),
-    (0xFA69, 'M', '響'),
-    (0xFA6A, 'M', 'é »'),
-    (0xFA6B, 'M', 'æµ'),
-    (0xFA6C, 'M', '𤋮'),
-    (0xFA6D, 'M', '舘'),
-    (0xFA6E, 'X'),
-    (0xFA70, 'M', '並'),
-    (0xFA71, 'M', '况'),
-    (0xFA72, 'M', 'å…¨'),
-    (0xFA73, 'M', 'ä¾€'),
-    (0xFA74, 'M', 'å……'),
-    (0xFA75, 'M', '冀'),
-    (0xFA76, 'M', '勇'),
-    (0xFA77, 'M', '勺'),
-    (0xFA78, 'M', 'å–'),
-    ]
-
-def _seg_43() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
-    return [
-    (0xFA79, 'M', 'å••'),
-    (0xFA7A, 'M', 'å–™'),
-    (0xFA7B, 'M', 'å—¢'),
-    (0xFA7C, 'M', '塚'),
-    (0xFA7D, 'M', '墳'),
-    (0xFA7E, 'M', '奄'),
-    (0xFA7F, 'M', '奔'),
-    (0xFA80, 'M', 'å©¢'),
-    (0xFA81, 'M', '嬨'),
-    (0xFA82, 'M', 'å»’'),
-    (0xFA83, 'M', 'å»™'),
-    (0xFA84, 'M', '彩'),
-    (0xFA85, 'M', 'å¾­'),
-    (0xFA86, 'M', '惘'),
-    (0xFA87, 'M', 'æ…Ž'),
-    (0xFA88, 'M', '愈'),
-    (0xFA89, 'M', '憎'),
-    (0xFA8A, 'M', 'æ… '),
-    (0xFA8B, 'M', '懲'),
-    (0xFA8C, 'M', '戴'),
-    (0xFA8D, 'M', 'æ„'),
-    (0xFA8E, 'M', 'æœ'),
-    (0xFA8F, 'M', 'æ‘’'),
-    (0xFA90, 'M', 'æ•–'),
-    (0xFA91, 'M', 'æ™´'),
-    (0xFA92, 'M', '朗'),
-    (0xFA93, 'M', '望'),
-    (0xFA94, 'M', 'æ–'),
-    (0xFA95, 'M', 'æ­¹'),
-    (0xFA96, 'M', '殺'),
-    (0xFA97, 'M', 'æµ'),
-    (0xFA98, 'M', 'æ»›'),
-    (0xFA99, 'M', '滋'),
-    (0xFA9A, 'M', 'æ¼¢'),
-    (0xFA9B, 'M', '瀞'),
-    (0xFA9C, 'M', 'ç…®'),
-    (0xFA9D, 'M', 'çž§'),
-    (0xFA9E, 'M', '爵'),
-    (0xFA9F, 'M', '犯'),
-    (0xFAA0, 'M', '猪'),
-    (0xFAA1, 'M', '瑱'),
-    (0xFAA2, 'M', '甆'),
-    (0xFAA3, 'M', 'ç”»'),
-    (0xFAA4, 'M', 'ç˜'),
-    (0xFAA5, 'M', '瘟'),
-    (0xFAA6, 'M', '益'),
-    (0xFAA7, 'M', 'ç››'),
-    (0xFAA8, 'M', 'ç›´'),
-    (0xFAA9, 'M', 'çŠ'),
-    (0xFAAA, 'M', 'ç€'),
-    (0xFAAB, 'M', '磌'),
-    (0xFAAC, 'M', '窱'),
-    (0xFAAD, 'M', '節'),
-    (0xFAAE, 'M', 'ç±»'),
-    (0xFAAF, 'M', 'çµ›'),
-    (0xFAB0, 'M', 'ç·´'),
-    (0xFAB1, 'M', 'ç¼¾'),
-    (0xFAB2, 'M', '者'),
-    (0xFAB3, 'M', 'è’'),
-    (0xFAB4, 'M', 'è¯'),
-    (0xFAB5, 'M', 'è¹'),
-    (0xFAB6, 'M', 'è¥'),
-    (0xFAB7, 'M', '覆'),
-    (0xFAB8, 'M', '視'),
-    (0xFAB9, 'M', '調'),
-    (0xFABA, 'M', '諸'),
-    (0xFABB, 'M', 'è«‹'),
-    (0xFABC, 'M', 'è¬'),
-    (0xFABD, 'M', '諾'),
-    (0xFABE, 'M', 'è«­'),
-    (0xFABF, 'M', '謹'),
-    (0xFAC0, 'M', '變'),
-    (0xFAC1, 'M', 'è´ˆ'),
-    (0xFAC2, 'M', '輸'),
-    (0xFAC3, 'M', 'é²'),
-    (0xFAC4, 'M', '醙'),
-    (0xFAC5, 'M', '鉶'),
-    (0xFAC6, 'M', '陼'),
-    (0xFAC7, 'M', '難'),
-    (0xFAC8, 'M', 'é–'),
-    (0xFAC9, 'M', '韛'),
-    (0xFACA, 'M', '響'),
-    (0xFACB, 'M', 'é ‹'),
-    (0xFACC, 'M', 'é »'),
-    (0xFACD, 'M', '鬒'),
-    (0xFACE, 'M', '龜'),
-    (0xFACF, 'M', '𢡊'),
-    (0xFAD0, 'M', '𢡄'),
-    (0xFAD1, 'M', 'ð£•'),
-    (0xFAD2, 'M', 'ã®'),
-    (0xFAD3, 'M', '䀘'),
-    (0xFAD4, 'M', '䀹'),
-    (0xFAD5, 'M', '𥉉'),
-    (0xFAD6, 'M', 'ð¥³'),
-    (0xFAD7, 'M', '𧻓'),
-    (0xFAD8, 'M', '齃'),
-    (0xFAD9, 'M', '龎'),
-    (0xFADA, 'X'),
-    (0xFB00, 'M', 'ff'),
-    (0xFB01, 'M', 'fi'),
-    ]
-
-def _seg_44() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
-    return [
-    (0xFB02, 'M', 'fl'),
-    (0xFB03, 'M', 'ffi'),
-    (0xFB04, 'M', 'ffl'),
-    (0xFB05, 'M', 'st'),
-    (0xFB07, 'X'),
-    (0xFB13, 'M', 'Õ´Õ¶'),
-    (0xFB14, 'M', 'Õ´Õ¥'),
-    (0xFB15, 'M', 'Õ´Õ«'),
-    (0xFB16, 'M', 'Õ¾Õ¶'),
-    (0xFB17, 'M', 'Õ´Õ­'),
-    (0xFB18, 'X'),
-    (0xFB1D, 'M', '×™Ö´'),
-    (0xFB1E, 'V'),
-    (0xFB1F, 'M', 'ײַ'),
-    (0xFB20, 'M', '×¢'),
-    (0xFB21, 'M', '×'),
-    (0xFB22, 'M', 'ד'),
-    (0xFB23, 'M', '×”'),
-    (0xFB24, 'M', '×›'),
-    (0xFB25, 'M', 'ל'),
-    (0xFB26, 'M', '×'),
-    (0xFB27, 'M', 'ר'),
-    (0xFB28, 'M', 'ת'),
-    (0xFB29, '3', '+'),
-    (0xFB2A, 'M', 'ש×'),
-    (0xFB2B, 'M', 'שׂ'),
-    (0xFB2C, 'M', 'שּ×'),
-    (0xFB2D, 'M', 'שּׂ'),
-    (0xFB2E, 'M', '×Ö·'),
-    (0xFB2F, 'M', '×Ö¸'),
-    (0xFB30, 'M', '×Ö¼'),
-    (0xFB31, 'M', 'בּ'),
-    (0xFB32, 'M', '×’Ö¼'),
-    (0xFB33, 'M', 'דּ'),
-    (0xFB34, 'M', '×”Ö¼'),
-    (0xFB35, 'M', 'וּ'),
-    (0xFB36, 'M', '×–Ö¼'),
-    (0xFB37, 'X'),
-    (0xFB38, 'M', 'טּ'),
-    (0xFB39, 'M', '×™Ö¼'),
-    (0xFB3A, 'M', 'ךּ'),
-    (0xFB3B, 'M', '×›Ö¼'),
-    (0xFB3C, 'M', 'לּ'),
-    (0xFB3D, 'X'),
-    (0xFB3E, 'M', 'מּ'),
-    (0xFB3F, 'X'),
-    (0xFB40, 'M', '× Ö¼'),
-    (0xFB41, 'M', 'סּ'),
-    (0xFB42, 'X'),
-    (0xFB43, 'M', '×£Ö¼'),
-    (0xFB44, 'M', 'פּ'),
-    (0xFB45, 'X'),
-    (0xFB46, 'M', 'צּ'),
-    (0xFB47, 'M', '×§Ö¼'),
-    (0xFB48, 'M', 'רּ'),
-    (0xFB49, 'M', 'שּ'),
-    (0xFB4A, 'M', 'תּ'),
-    (0xFB4B, 'M', 'וֹ'),
-    (0xFB4C, 'M', 'בֿ'),
-    (0xFB4D, 'M', '×›Ö¿'),
-    (0xFB4E, 'M', 'פֿ'),
-    (0xFB4F, 'M', '×ל'),
-    (0xFB50, 'M', 'Ù±'),
-    (0xFB52, 'M', 'Ù»'),
-    (0xFB56, 'M', 'Ù¾'),
-    (0xFB5A, 'M', 'Ú€'),
-    (0xFB5E, 'M', 'Ùº'),
-    (0xFB62, 'M', 'Ù¿'),
-    (0xFB66, 'M', 'Ù¹'),
-    (0xFB6A, 'M', 'Ú¤'),
-    (0xFB6E, 'M', 'Ú¦'),
-    (0xFB72, 'M', 'Ú„'),
-    (0xFB76, 'M', 'Úƒ'),
-    (0xFB7A, 'M', 'Ú†'),
-    (0xFB7E, 'M', 'Ú‡'),
-    (0xFB82, 'M', 'Ú'),
-    (0xFB84, 'M', 'ڌ'),
-    (0xFB86, 'M', 'ÚŽ'),
-    (0xFB88, 'M', 'Úˆ'),
-    (0xFB8A, 'M', 'Ú˜'),
-    (0xFB8C, 'M', 'Ú‘'),
-    (0xFB8E, 'M', 'Ú©'),
-    (0xFB92, 'M', 'Ú¯'),
-    (0xFB96, 'M', 'Ú³'),
-    (0xFB9A, 'M', 'Ú±'),
-    (0xFB9E, 'M', 'Úº'),
-    (0xFBA0, 'M', 'Ú»'),
-    (0xFBA4, 'M', 'Û€'),
-    (0xFBA6, 'M', 'Û'),
-    (0xFBAA, 'M', 'Ú¾'),
-    (0xFBAE, 'M', 'Û’'),
-    (0xFBB0, 'M', 'Û“'),
-    (0xFBB2, 'V'),
-    (0xFBC3, 'X'),
-    (0xFBD3, 'M', 'Ú­'),
-    (0xFBD7, 'M', 'Û‡'),
-    (0xFBD9, 'M', 'Û†'),
-    (0xFBDB, 'M', 'Ûˆ'),
-    (0xFBDD, 'M', 'Û‡Ù´'),
-    (0xFBDE, 'M', 'Û‹'),
-    ]
-
-def _seg_45() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
-    return [
-    (0xFBE0, 'M', 'Û…'),
-    (0xFBE2, 'M', 'Û‰'),
-    (0xFBE4, 'M', 'Û'),
-    (0xFBE8, 'M', 'Ù‰'),
-    (0xFBEA, 'M', 'ئا'),
-    (0xFBEC, 'M', 'ئە'),
-    (0xFBEE, 'M', 'ئو'),
-    (0xFBF0, 'M', 'ئۇ'),
-    (0xFBF2, 'M', 'ئۆ'),
-    (0xFBF4, 'M', 'ئۈ'),
-    (0xFBF6, 'M', 'ئÛ'),
-    (0xFBF9, 'M', 'ئى'),
-    (0xFBFC, 'M', 'ی'),
-    (0xFC00, 'M', 'ئج'),
-    (0xFC01, 'M', 'ئح'),
-    (0xFC02, 'M', 'ئم'),
-    (0xFC03, 'M', 'ئى'),
-    (0xFC04, 'M', 'ئي'),
-    (0xFC05, 'M', 'بج'),
-    (0xFC06, 'M', 'بح'),
-    (0xFC07, 'M', 'بخ'),
-    (0xFC08, 'M', 'بم'),
-    (0xFC09, 'M', 'بى'),
-    (0xFC0A, 'M', 'بي'),
-    (0xFC0B, 'M', 'تج'),
-    (0xFC0C, 'M', 'تح'),
-    (0xFC0D, 'M', 'تخ'),
-    (0xFC0E, 'M', 'تم'),
-    (0xFC0F, 'M', 'تى'),
-    (0xFC10, 'M', 'تي'),
-    (0xFC11, 'M', 'ثج'),
-    (0xFC12, 'M', 'ثم'),
-    (0xFC13, 'M', 'ثى'),
-    (0xFC14, 'M', 'ثي'),
-    (0xFC15, 'M', 'جح'),
-    (0xFC16, 'M', 'جم'),
-    (0xFC17, 'M', 'حج'),
-    (0xFC18, 'M', 'حم'),
-    (0xFC19, 'M', 'خج'),
-    (0xFC1A, 'M', 'خح'),
-    (0xFC1B, 'M', 'خم'),
-    (0xFC1C, 'M', 'سج'),
-    (0xFC1D, 'M', 'سح'),
-    (0xFC1E, 'M', 'سخ'),
-    (0xFC1F, 'M', 'سم'),
-    (0xFC20, 'M', 'صح'),
-    (0xFC21, 'M', 'صم'),
-    (0xFC22, 'M', 'ضج'),
-    (0xFC23, 'M', 'ضح'),
-    (0xFC24, 'M', 'ضخ'),
-    (0xFC25, 'M', 'ضم'),
-    (0xFC26, 'M', 'طح'),
-    (0xFC27, 'M', 'طم'),
-    (0xFC28, 'M', 'ظم'),
-    (0xFC29, 'M', 'عج'),
-    (0xFC2A, 'M', 'عم'),
-    (0xFC2B, 'M', 'غج'),
-    (0xFC2C, 'M', 'غم'),
-    (0xFC2D, 'M', 'ÙØ¬'),
-    (0xFC2E, 'M', 'ÙØ­'),
-    (0xFC2F, 'M', 'ÙØ®'),
-    (0xFC30, 'M', 'ÙÙ…'),
-    (0xFC31, 'M', 'ÙÙ‰'),
-    (0xFC32, 'M', 'ÙÙŠ'),
-    (0xFC33, 'M', 'قح'),
-    (0xFC34, 'M', 'قم'),
-    (0xFC35, 'M', 'قى'),
-    (0xFC36, 'M', 'قي'),
-    (0xFC37, 'M', 'كا'),
-    (0xFC38, 'M', 'كج'),
-    (0xFC39, 'M', 'كح'),
-    (0xFC3A, 'M', 'كخ'),
-    (0xFC3B, 'M', 'كل'),
-    (0xFC3C, 'M', 'كم'),
-    (0xFC3D, 'M', 'كى'),
-    (0xFC3E, 'M', 'كي'),
-    (0xFC3F, 'M', 'لج'),
-    (0xFC40, 'M', 'لح'),
-    (0xFC41, 'M', 'لخ'),
-    (0xFC42, 'M', 'لم'),
-    (0xFC43, 'M', 'لى'),
-    (0xFC44, 'M', 'لي'),
-    (0xFC45, 'M', 'مج'),
-    (0xFC46, 'M', 'مح'),
-    (0xFC47, 'M', 'مخ'),
-    (0xFC48, 'M', 'مم'),
-    (0xFC49, 'M', 'مى'),
-    (0xFC4A, 'M', 'مي'),
-    (0xFC4B, 'M', 'نج'),
-    (0xFC4C, 'M', 'نح'),
-    (0xFC4D, 'M', 'نخ'),
-    (0xFC4E, 'M', 'نم'),
-    (0xFC4F, 'M', 'نى'),
-    (0xFC50, 'M', 'ني'),
-    (0xFC51, 'M', 'هج'),
-    (0xFC52, 'M', 'هم'),
-    (0xFC53, 'M', 'هى'),
-    (0xFC54, 'M', 'هي'),
-    (0xFC55, 'M', 'يج'),
-    (0xFC56, 'M', 'يح'),
-    ]
-
-def _seg_46() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
-    return [
-    (0xFC57, 'M', 'يخ'),
-    (0xFC58, 'M', 'يم'),
-    (0xFC59, 'M', 'يى'),
-    (0xFC5A, 'M', 'يي'),
-    (0xFC5B, 'M', 'ذٰ'),
-    (0xFC5C, 'M', 'رٰ'),
-    (0xFC5D, 'M', 'ىٰ'),
-    (0xFC5E, '3', ' ٌّ'),
-    (0xFC5F, '3', ' ÙÙ‘'),
-    (0xFC60, '3', ' ÙŽÙ‘'),
-    (0xFC61, '3', ' ÙÙ‘'),
-    (0xFC62, '3', ' ÙÙ‘'),
-    (0xFC63, '3', ' ّٰ'),
-    (0xFC64, 'M', 'ئر'),
-    (0xFC65, 'M', 'ئز'),
-    (0xFC66, 'M', 'ئم'),
-    (0xFC67, 'M', 'ئن'),
-    (0xFC68, 'M', 'ئى'),
-    (0xFC69, 'M', 'ئي'),
-    (0xFC6A, 'M', 'بر'),
-    (0xFC6B, 'M', 'بز'),
-    (0xFC6C, 'M', 'بم'),
-    (0xFC6D, 'M', 'بن'),
-    (0xFC6E, 'M', 'بى'),
-    (0xFC6F, 'M', 'بي'),
-    (0xFC70, 'M', 'تر'),
-    (0xFC71, 'M', 'تز'),
-    (0xFC72, 'M', 'تم'),
-    (0xFC73, 'M', 'تن'),
-    (0xFC74, 'M', 'تى'),
-    (0xFC75, 'M', 'تي'),
-    (0xFC76, 'M', 'ثر'),
-    (0xFC77, 'M', 'ثز'),
-    (0xFC78, 'M', 'ثم'),
-    (0xFC79, 'M', 'ثن'),
-    (0xFC7A, 'M', 'ثى'),
-    (0xFC7B, 'M', 'ثي'),
-    (0xFC7C, 'M', 'ÙÙ‰'),
-    (0xFC7D, 'M', 'ÙÙŠ'),
-    (0xFC7E, 'M', 'قى'),
-    (0xFC7F, 'M', 'قي'),
-    (0xFC80, 'M', 'كا'),
-    (0xFC81, 'M', 'كل'),
-    (0xFC82, 'M', 'كم'),
-    (0xFC83, 'M', 'كى'),
-    (0xFC84, 'M', 'كي'),
-    (0xFC85, 'M', 'لم'),
-    (0xFC86, 'M', 'لى'),
-    (0xFC87, 'M', 'لي'),
-    (0xFC88, 'M', 'ما'),
-    (0xFC89, 'M', 'مم'),
-    (0xFC8A, 'M', 'نر'),
-    (0xFC8B, 'M', 'نز'),
-    (0xFC8C, 'M', 'نم'),
-    (0xFC8D, 'M', 'نن'),
-    (0xFC8E, 'M', 'نى'),
-    (0xFC8F, 'M', 'ني'),
-    (0xFC90, 'M', 'ىٰ'),
-    (0xFC91, 'M', 'ير'),
-    (0xFC92, 'M', 'يز'),
-    (0xFC93, 'M', 'يم'),
-    (0xFC94, 'M', 'ين'),
-    (0xFC95, 'M', 'يى'),
-    (0xFC96, 'M', 'يي'),
-    (0xFC97, 'M', 'ئج'),
-    (0xFC98, 'M', 'ئح'),
-    (0xFC99, 'M', 'ئخ'),
-    (0xFC9A, 'M', 'ئم'),
-    (0xFC9B, 'M', 'ئه'),
-    (0xFC9C, 'M', 'بج'),
-    (0xFC9D, 'M', 'بح'),
-    (0xFC9E, 'M', 'بخ'),
-    (0xFC9F, 'M', 'بم'),
-    (0xFCA0, 'M', 'به'),
-    (0xFCA1, 'M', 'تج'),
-    (0xFCA2, 'M', 'تح'),
-    (0xFCA3, 'M', 'تخ'),
-    (0xFCA4, 'M', 'تم'),
-    (0xFCA5, 'M', 'ته'),
-    (0xFCA6, 'M', 'ثم'),
-    (0xFCA7, 'M', 'جح'),
-    (0xFCA8, 'M', 'جم'),
-    (0xFCA9, 'M', 'حج'),
-    (0xFCAA, 'M', 'حم'),
-    (0xFCAB, 'M', 'خج'),
-    (0xFCAC, 'M', 'خم'),
-    (0xFCAD, 'M', 'سج'),
-    (0xFCAE, 'M', 'سح'),
-    (0xFCAF, 'M', 'سخ'),
-    (0xFCB0, 'M', 'سم'),
-    (0xFCB1, 'M', 'صح'),
-    (0xFCB2, 'M', 'صخ'),
-    (0xFCB3, 'M', 'صم'),
-    (0xFCB4, 'M', 'ضج'),
-    (0xFCB5, 'M', 'ضح'),
-    (0xFCB6, 'M', 'ضخ'),
-    (0xFCB7, 'M', 'ضم'),
-    (0xFCB8, 'M', 'طح'),
-    (0xFCB9, 'M', 'ظم'),
-    (0xFCBA, 'M', 'عج'),
-    ]
-
-def _seg_47() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
-    return [
-    (0xFCBB, 'M', 'عم'),
-    (0xFCBC, 'M', 'غج'),
-    (0xFCBD, 'M', 'غم'),
-    (0xFCBE, 'M', 'ÙØ¬'),
-    (0xFCBF, 'M', 'ÙØ­'),
-    (0xFCC0, 'M', 'ÙØ®'),
-    (0xFCC1, 'M', 'ÙÙ…'),
-    (0xFCC2, 'M', 'قح'),
-    (0xFCC3, 'M', 'قم'),
-    (0xFCC4, 'M', 'كج'),
-    (0xFCC5, 'M', 'كح'),
-    (0xFCC6, 'M', 'كخ'),
-    (0xFCC7, 'M', 'كل'),
-    (0xFCC8, 'M', 'كم'),
-    (0xFCC9, 'M', 'لج'),
-    (0xFCCA, 'M', 'لح'),
-    (0xFCCB, 'M', 'لخ'),
-    (0xFCCC, 'M', 'لم'),
-    (0xFCCD, 'M', 'له'),
-    (0xFCCE, 'M', 'مج'),
-    (0xFCCF, 'M', 'مح'),
-    (0xFCD0, 'M', 'مخ'),
-    (0xFCD1, 'M', 'مم'),
-    (0xFCD2, 'M', 'نج'),
-    (0xFCD3, 'M', 'نح'),
-    (0xFCD4, 'M', 'نخ'),
-    (0xFCD5, 'M', 'نم'),
-    (0xFCD6, 'M', 'نه'),
-    (0xFCD7, 'M', 'هج'),
-    (0xFCD8, 'M', 'هم'),
-    (0xFCD9, 'M', 'هٰ'),
-    (0xFCDA, 'M', 'يج'),
-    (0xFCDB, 'M', 'يح'),
-    (0xFCDC, 'M', 'يخ'),
-    (0xFCDD, 'M', 'يم'),
-    (0xFCDE, 'M', 'يه'),
-    (0xFCDF, 'M', 'ئم'),
-    (0xFCE0, 'M', 'ئه'),
-    (0xFCE1, 'M', 'بم'),
-    (0xFCE2, 'M', 'به'),
-    (0xFCE3, 'M', 'تم'),
-    (0xFCE4, 'M', 'ته'),
-    (0xFCE5, 'M', 'ثم'),
-    (0xFCE6, 'M', 'ثه'),
-    (0xFCE7, 'M', 'سم'),
-    (0xFCE8, 'M', 'سه'),
-    (0xFCE9, 'M', 'شم'),
-    (0xFCEA, 'M', 'شه'),
-    (0xFCEB, 'M', 'كل'),
-    (0xFCEC, 'M', 'كم'),
-    (0xFCED, 'M', 'لم'),
-    (0xFCEE, 'M', 'نم'),
-    (0xFCEF, 'M', 'نه'),
-    (0xFCF0, 'M', 'يم'),
-    (0xFCF1, 'M', 'يه'),
-    (0xFCF2, 'M', 'Ù€ÙŽÙ‘'),
-    (0xFCF3, 'M', 'Ù€ÙÙ‘'),
-    (0xFCF4, 'M', 'Ù€ÙÙ‘'),
-    (0xFCF5, 'M', 'طى'),
-    (0xFCF6, 'M', 'طي'),
-    (0xFCF7, 'M', 'عى'),
-    (0xFCF8, 'M', 'عي'),
-    (0xFCF9, 'M', 'غى'),
-    (0xFCFA, 'M', 'غي'),
-    (0xFCFB, 'M', 'سى'),
-    (0xFCFC, 'M', 'سي'),
-    (0xFCFD, 'M', 'شى'),
-    (0xFCFE, 'M', 'شي'),
-    (0xFCFF, 'M', 'حى'),
-    (0xFD00, 'M', 'حي'),
-    (0xFD01, 'M', 'جى'),
-    (0xFD02, 'M', 'جي'),
-    (0xFD03, 'M', 'خى'),
-    (0xFD04, 'M', 'خي'),
-    (0xFD05, 'M', 'صى'),
-    (0xFD06, 'M', 'صي'),
-    (0xFD07, 'M', 'ضى'),
-    (0xFD08, 'M', 'ضي'),
-    (0xFD09, 'M', 'شج'),
-    (0xFD0A, 'M', 'شح'),
-    (0xFD0B, 'M', 'شخ'),
-    (0xFD0C, 'M', 'شم'),
-    (0xFD0D, 'M', 'شر'),
-    (0xFD0E, 'M', 'سر'),
-    (0xFD0F, 'M', 'صر'),
-    (0xFD10, 'M', 'ضر'),
-    (0xFD11, 'M', 'طى'),
-    (0xFD12, 'M', 'طي'),
-    (0xFD13, 'M', 'عى'),
-    (0xFD14, 'M', 'عي'),
-    (0xFD15, 'M', 'غى'),
-    (0xFD16, 'M', 'غي'),
-    (0xFD17, 'M', 'سى'),
-    (0xFD18, 'M', 'سي'),
-    (0xFD19, 'M', 'شى'),
-    (0xFD1A, 'M', 'شي'),
-    (0xFD1B, 'M', 'حى'),
-    (0xFD1C, 'M', 'حي'),
-    (0xFD1D, 'M', 'جى'),
-    (0xFD1E, 'M', 'جي'),
-    ]
-
-def _seg_48() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
-    return [
-    (0xFD1F, 'M', 'خى'),
-    (0xFD20, 'M', 'خي'),
-    (0xFD21, 'M', 'صى'),
-    (0xFD22, 'M', 'صي'),
-    (0xFD23, 'M', 'ضى'),
-    (0xFD24, 'M', 'ضي'),
-    (0xFD25, 'M', 'شج'),
-    (0xFD26, 'M', 'شح'),
-    (0xFD27, 'M', 'شخ'),
-    (0xFD28, 'M', 'شم'),
-    (0xFD29, 'M', 'شر'),
-    (0xFD2A, 'M', 'سر'),
-    (0xFD2B, 'M', 'صر'),
-    (0xFD2C, 'M', 'ضر'),
-    (0xFD2D, 'M', 'شج'),
-    (0xFD2E, 'M', 'شح'),
-    (0xFD2F, 'M', 'شخ'),
-    (0xFD30, 'M', 'شم'),
-    (0xFD31, 'M', 'سه'),
-    (0xFD32, 'M', 'شه'),
-    (0xFD33, 'M', 'طم'),
-    (0xFD34, 'M', 'سج'),
-    (0xFD35, 'M', 'سح'),
-    (0xFD36, 'M', 'سخ'),
-    (0xFD37, 'M', 'شج'),
-    (0xFD38, 'M', 'شح'),
-    (0xFD39, 'M', 'شخ'),
-    (0xFD3A, 'M', 'طم'),
-    (0xFD3B, 'M', 'ظم'),
-    (0xFD3C, 'M', 'اً'),
-    (0xFD3E, 'V'),
-    (0xFD50, 'M', 'تجم'),
-    (0xFD51, 'M', 'تحج'),
-    (0xFD53, 'M', 'تحم'),
-    (0xFD54, 'M', 'تخم'),
-    (0xFD55, 'M', 'تمج'),
-    (0xFD56, 'M', 'تمح'),
-    (0xFD57, 'M', 'تمخ'),
-    (0xFD58, 'M', 'جمح'),
-    (0xFD5A, 'M', 'حمي'),
-    (0xFD5B, 'M', 'حمى'),
-    (0xFD5C, 'M', 'سحج'),
-    (0xFD5D, 'M', 'سجح'),
-    (0xFD5E, 'M', 'سجى'),
-    (0xFD5F, 'M', 'سمح'),
-    (0xFD61, 'M', 'سمج'),
-    (0xFD62, 'M', 'سمم'),
-    (0xFD64, 'M', 'صحح'),
-    (0xFD66, 'M', 'صمم'),
-    (0xFD67, 'M', 'شحم'),
-    (0xFD69, 'M', 'شجي'),
-    (0xFD6A, 'M', 'شمخ'),
-    (0xFD6C, 'M', 'شمم'),
-    (0xFD6E, 'M', 'ضحى'),
-    (0xFD6F, 'M', 'ضخم'),
-    (0xFD71, 'M', 'طمح'),
-    (0xFD73, 'M', 'طمم'),
-    (0xFD74, 'M', 'طمي'),
-    (0xFD75, 'M', 'عجم'),
-    (0xFD76, 'M', 'عمم'),
-    (0xFD78, 'M', 'عمى'),
-    (0xFD79, 'M', 'غمم'),
-    (0xFD7A, 'M', 'غمي'),
-    (0xFD7B, 'M', 'غمى'),
-    (0xFD7C, 'M', 'ÙØ®Ù…'),
-    (0xFD7E, 'M', 'قمح'),
-    (0xFD7F, 'M', 'قمم'),
-    (0xFD80, 'M', 'لحم'),
-    (0xFD81, 'M', 'لحي'),
-    (0xFD82, 'M', 'لحى'),
-    (0xFD83, 'M', 'لجج'),
-    (0xFD85, 'M', 'لخم'),
-    (0xFD87, 'M', 'لمح'),
-    (0xFD89, 'M', 'محج'),
-    (0xFD8A, 'M', 'محم'),
-    (0xFD8B, 'M', 'محي'),
-    (0xFD8C, 'M', 'مجح'),
-    (0xFD8D, 'M', 'مجم'),
-    (0xFD8E, 'M', 'مخج'),
-    (0xFD8F, 'M', 'مخم'),
-    (0xFD90, 'X'),
-    (0xFD92, 'M', 'مجخ'),
-    (0xFD93, 'M', 'همج'),
-    (0xFD94, 'M', 'همم'),
-    (0xFD95, 'M', 'نحم'),
-    (0xFD96, 'M', 'نحى'),
-    (0xFD97, 'M', 'نجم'),
-    (0xFD99, 'M', 'نجى'),
-    (0xFD9A, 'M', 'نمي'),
-    (0xFD9B, 'M', 'نمى'),
-    (0xFD9C, 'M', 'يمم'),
-    (0xFD9E, 'M', 'بخي'),
-    (0xFD9F, 'M', 'تجي'),
-    (0xFDA0, 'M', 'تجى'),
-    (0xFDA1, 'M', 'تخي'),
-    (0xFDA2, 'M', 'تخى'),
-    (0xFDA3, 'M', 'تمي'),
-    (0xFDA4, 'M', 'تمى'),
-    (0xFDA5, 'M', 'جمي'),
-    (0xFDA6, 'M', 'جحى'),
-    ]
-
-def _seg_49() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
-    return [
-    (0xFDA7, 'M', 'جمى'),
-    (0xFDA8, 'M', 'سخى'),
-    (0xFDA9, 'M', 'صحي'),
-    (0xFDAA, 'M', 'شحي'),
-    (0xFDAB, 'M', 'ضحي'),
-    (0xFDAC, 'M', 'لجي'),
-    (0xFDAD, 'M', 'لمي'),
-    (0xFDAE, 'M', 'يحي'),
-    (0xFDAF, 'M', 'يجي'),
-    (0xFDB0, 'M', 'يمي'),
-    (0xFDB1, 'M', 'ممي'),
-    (0xFDB2, 'M', 'قمي'),
-    (0xFDB3, 'M', 'نحي'),
-    (0xFDB4, 'M', 'قمح'),
-    (0xFDB5, 'M', 'لحم'),
-    (0xFDB6, 'M', 'عمي'),
-    (0xFDB7, 'M', 'كمي'),
-    (0xFDB8, 'M', 'نجح'),
-    (0xFDB9, 'M', 'مخي'),
-    (0xFDBA, 'M', 'لجم'),
-    (0xFDBB, 'M', 'كمم'),
-    (0xFDBC, 'M', 'لجم'),
-    (0xFDBD, 'M', 'نجح'),
-    (0xFDBE, 'M', 'جحي'),
-    (0xFDBF, 'M', 'حجي'),
-    (0xFDC0, 'M', 'مجي'),
-    (0xFDC1, 'M', 'Ùمي'),
-    (0xFDC2, 'M', 'بحي'),
-    (0xFDC3, 'M', 'كمم'),
-    (0xFDC4, 'M', 'عجم'),
-    (0xFDC5, 'M', 'صمم'),
-    (0xFDC6, 'M', 'سخي'),
-    (0xFDC7, 'M', 'نجي'),
-    (0xFDC8, 'X'),
-    (0xFDCF, 'V'),
-    (0xFDD0, 'X'),
-    (0xFDF0, 'M', 'صلے'),
-    (0xFDF1, 'M', 'قلے'),
-    (0xFDF2, 'M', 'الله'),
-    (0xFDF3, 'M', 'اكبر'),
-    (0xFDF4, 'M', 'محمد'),
-    (0xFDF5, 'M', 'صلعم'),
-    (0xFDF6, 'M', 'رسول'),
-    (0xFDF7, 'M', 'عليه'),
-    (0xFDF8, 'M', 'وسلم'),
-    (0xFDF9, 'M', 'صلى'),
-    (0xFDFA, '3', 'صلى الله عليه وسلم'),
-    (0xFDFB, '3', 'جل جلاله'),
-    (0xFDFC, 'M', 'ریال'),
-    (0xFDFD, 'V'),
-    (0xFE00, 'I'),
-    (0xFE10, '3', ','),
-    (0xFE11, 'M', 'ã€'),
-    (0xFE12, 'X'),
-    (0xFE13, '3', ':'),
-    (0xFE14, '3', ';'),
-    (0xFE15, '3', '!'),
-    (0xFE16, '3', '?'),
-    (0xFE17, 'M', '〖'),
-    (0xFE18, 'M', '〗'),
-    (0xFE19, 'X'),
-    (0xFE20, 'V'),
-    (0xFE30, 'X'),
-    (0xFE31, 'M', '—'),
-    (0xFE32, 'M', '–'),
-    (0xFE33, '3', '_'),
-    (0xFE35, '3', '('),
-    (0xFE36, '3', ')'),
-    (0xFE37, '3', '{'),
-    (0xFE38, '3', '}'),
-    (0xFE39, 'M', '〔'),
-    (0xFE3A, 'M', '〕'),
-    (0xFE3B, 'M', 'ã€'),
-    (0xFE3C, 'M', '】'),
-    (0xFE3D, 'M', '《'),
-    (0xFE3E, 'M', '》'),
-    (0xFE3F, 'M', '〈'),
-    (0xFE40, 'M', '〉'),
-    (0xFE41, 'M', '「'),
-    (0xFE42, 'M', 'ã€'),
-    (0xFE43, 'M', '『'),
-    (0xFE44, 'M', 'ã€'),
-    (0xFE45, 'V'),
-    (0xFE47, '3', '['),
-    (0xFE48, '3', ']'),
-    (0xFE49, '3', ' Ì…'),
-    (0xFE4D, '3', '_'),
-    (0xFE50, '3', ','),
-    (0xFE51, 'M', 'ã€'),
-    (0xFE52, 'X'),
-    (0xFE54, '3', ';'),
-    (0xFE55, '3', ':'),
-    (0xFE56, '3', '?'),
-    (0xFE57, '3', '!'),
-    (0xFE58, 'M', '—'),
-    (0xFE59, '3', '('),
-    (0xFE5A, '3', ')'),
-    (0xFE5B, '3', '{'),
-    (0xFE5C, '3', '}'),
-    (0xFE5D, 'M', '〔'),
-    ]
-
-def _seg_50() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
-    return [
-    (0xFE5E, 'M', '〕'),
-    (0xFE5F, '3', '#'),
-    (0xFE60, '3', '&'),
-    (0xFE61, '3', '*'),
-    (0xFE62, '3', '+'),
-    (0xFE63, 'M', '-'),
-    (0xFE64, '3', '<'),
-    (0xFE65, '3', '>'),
-    (0xFE66, '3', '='),
-    (0xFE67, 'X'),
-    (0xFE68, '3', '\\'),
-    (0xFE69, '3', '$'),
-    (0xFE6A, '3', '%'),
-    (0xFE6B, '3', '@'),
-    (0xFE6C, 'X'),
-    (0xFE70, '3', ' Ù‹'),
-    (0xFE71, 'M', 'ـً'),
-    (0xFE72, '3', ' ٌ'),
-    (0xFE73, 'V'),
-    (0xFE74, '3', ' Ù'),
-    (0xFE75, 'X'),
-    (0xFE76, '3', ' ÙŽ'),
-    (0xFE77, 'M', 'Ù€ÙŽ'),
-    (0xFE78, '3', ' Ù'),
-    (0xFE79, 'M', 'Ù€Ù'),
-    (0xFE7A, '3', ' Ù'),
-    (0xFE7B, 'M', 'Ù€Ù'),
-    (0xFE7C, '3', ' Ù‘'),
-    (0xFE7D, 'M', 'ـّ'),
-    (0xFE7E, '3', ' Ù’'),
-    (0xFE7F, 'M', 'ـْ'),
-    (0xFE80, 'M', 'Ø¡'),
-    (0xFE81, 'M', 'Ø¢'),
-    (0xFE83, 'M', 'Ø£'),
-    (0xFE85, 'M', 'ؤ'),
-    (0xFE87, 'M', 'Ø¥'),
-    (0xFE89, 'M', 'ئ'),
-    (0xFE8D, 'M', 'ا'),
-    (0xFE8F, 'M', 'ب'),
-    (0xFE93, 'M', 'Ø©'),
-    (0xFE95, 'M', 'ت'),
-    (0xFE99, 'M', 'Ø«'),
-    (0xFE9D, 'M', 'ج'),
-    (0xFEA1, 'M', 'Ø­'),
-    (0xFEA5, 'M', 'Ø®'),
-    (0xFEA9, 'M', 'د'),
-    (0xFEAB, 'M', 'ذ'),
-    (0xFEAD, 'M', 'ر'),
-    (0xFEAF, 'M', 'ز'),
-    (0xFEB1, 'M', 'س'),
-    (0xFEB5, 'M', 'Ø´'),
-    (0xFEB9, 'M', 'ص'),
-    (0xFEBD, 'M', 'ض'),
-    (0xFEC1, 'M', 'Ø·'),
-    (0xFEC5, 'M', 'ظ'),
-    (0xFEC9, 'M', 'ع'),
-    (0xFECD, 'M', 'غ'),
-    (0xFED1, 'M', 'Ù'),
-    (0xFED5, 'M', 'Ù‚'),
-    (0xFED9, 'M', 'Ùƒ'),
-    (0xFEDD, 'M', 'Ù„'),
-    (0xFEE1, 'M', 'Ù…'),
-    (0xFEE5, 'M', 'Ù†'),
-    (0xFEE9, 'M', 'Ù‡'),
-    (0xFEED, 'M', 'Ùˆ'),
-    (0xFEEF, 'M', 'Ù‰'),
-    (0xFEF1, 'M', 'ÙŠ'),
-    (0xFEF5, 'M', 'لآ'),
-    (0xFEF7, 'M', 'لأ'),
-    (0xFEF9, 'M', 'لإ'),
-    (0xFEFB, 'M', 'لا'),
-    (0xFEFD, 'X'),
-    (0xFEFF, 'I'),
-    (0xFF00, 'X'),
-    (0xFF01, '3', '!'),
-    (0xFF02, '3', '"'),
-    (0xFF03, '3', '#'),
-    (0xFF04, '3', '$'),
-    (0xFF05, '3', '%'),
-    (0xFF06, '3', '&'),
-    (0xFF07, '3', '\''),
-    (0xFF08, '3', '('),
-    (0xFF09, '3', ')'),
-    (0xFF0A, '3', '*'),
-    (0xFF0B, '3', '+'),
-    (0xFF0C, '3', ','),
-    (0xFF0D, 'M', '-'),
-    (0xFF0E, 'M', '.'),
-    (0xFF0F, '3', '/'),
-    (0xFF10, 'M', '0'),
-    (0xFF11, 'M', '1'),
-    (0xFF12, 'M', '2'),
-    (0xFF13, 'M', '3'),
-    (0xFF14, 'M', '4'),
-    (0xFF15, 'M', '5'),
-    (0xFF16, 'M', '6'),
-    (0xFF17, 'M', '7'),
-    (0xFF18, 'M', '8'),
-    (0xFF19, 'M', '9'),
-    (0xFF1A, '3', ':'),
-    ]
-
-def _seg_51() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
-    return [
-    (0xFF1B, '3', ';'),
-    (0xFF1C, '3', '<'),
-    (0xFF1D, '3', '='),
-    (0xFF1E, '3', '>'),
-    (0xFF1F, '3', '?'),
-    (0xFF20, '3', '@'),
-    (0xFF21, 'M', 'a'),
-    (0xFF22, 'M', 'b'),
-    (0xFF23, 'M', 'c'),
-    (0xFF24, 'M', 'd'),
-    (0xFF25, 'M', 'e'),
-    (0xFF26, 'M', 'f'),
-    (0xFF27, 'M', 'g'),
-    (0xFF28, 'M', 'h'),
-    (0xFF29, 'M', 'i'),
-    (0xFF2A, 'M', 'j'),
-    (0xFF2B, 'M', 'k'),
-    (0xFF2C, 'M', 'l'),
-    (0xFF2D, 'M', 'm'),
-    (0xFF2E, 'M', 'n'),
-    (0xFF2F, 'M', 'o'),
-    (0xFF30, 'M', 'p'),
-    (0xFF31, 'M', 'q'),
-    (0xFF32, 'M', 'r'),
-    (0xFF33, 'M', 's'),
-    (0xFF34, 'M', 't'),
-    (0xFF35, 'M', 'u'),
-    (0xFF36, 'M', 'v'),
-    (0xFF37, 'M', 'w'),
-    (0xFF38, 'M', 'x'),
-    (0xFF39, 'M', 'y'),
-    (0xFF3A, 'M', 'z'),
-    (0xFF3B, '3', '['),
-    (0xFF3C, '3', '\\'),
-    (0xFF3D, '3', ']'),
-    (0xFF3E, '3', '^'),
-    (0xFF3F, '3', '_'),
-    (0xFF40, '3', '`'),
-    (0xFF41, 'M', 'a'),
-    (0xFF42, 'M', 'b'),
-    (0xFF43, 'M', 'c'),
-    (0xFF44, 'M', 'd'),
-    (0xFF45, 'M', 'e'),
-    (0xFF46, 'M', 'f'),
-    (0xFF47, 'M', 'g'),
-    (0xFF48, 'M', 'h'),
-    (0xFF49, 'M', 'i'),
-    (0xFF4A, 'M', 'j'),
-    (0xFF4B, 'M', 'k'),
-    (0xFF4C, 'M', 'l'),
-    (0xFF4D, 'M', 'm'),
-    (0xFF4E, 'M', 'n'),
-    (0xFF4F, 'M', 'o'),
-    (0xFF50, 'M', 'p'),
-    (0xFF51, 'M', 'q'),
-    (0xFF52, 'M', 'r'),
-    (0xFF53, 'M', 's'),
-    (0xFF54, 'M', 't'),
-    (0xFF55, 'M', 'u'),
-    (0xFF56, 'M', 'v'),
-    (0xFF57, 'M', 'w'),
-    (0xFF58, 'M', 'x'),
-    (0xFF59, 'M', 'y'),
-    (0xFF5A, 'M', 'z'),
-    (0xFF5B, '3', '{'),
-    (0xFF5C, '3', '|'),
-    (0xFF5D, '3', '}'),
-    (0xFF5E, '3', '~'),
-    (0xFF5F, 'M', '⦅'),
-    (0xFF60, 'M', '⦆'),
-    (0xFF61, 'M', '.'),
-    (0xFF62, 'M', '「'),
-    (0xFF63, 'M', 'ã€'),
-    (0xFF64, 'M', 'ã€'),
-    (0xFF65, 'M', '・'),
-    (0xFF66, 'M', 'ヲ'),
-    (0xFF67, 'M', 'ã‚¡'),
-    (0xFF68, 'M', 'ã‚£'),
-    (0xFF69, 'M', 'ã‚¥'),
-    (0xFF6A, 'M', 'ã‚§'),
-    (0xFF6B, 'M', 'ã‚©'),
-    (0xFF6C, 'M', 'ャ'),
-    (0xFF6D, 'M', 'ュ'),
-    (0xFF6E, 'M', 'ョ'),
-    (0xFF6F, 'M', 'ッ'),
-    (0xFF70, 'M', 'ー'),
-    (0xFF71, 'M', 'ã‚¢'),
-    (0xFF72, 'M', 'イ'),
-    (0xFF73, 'M', 'ウ'),
-    (0xFF74, 'M', 'エ'),
-    (0xFF75, 'M', 'オ'),
-    (0xFF76, 'M', 'ã‚«'),
-    (0xFF77, 'M', 'ã‚­'),
-    (0xFF78, 'M', 'ク'),
-    (0xFF79, 'M', 'ケ'),
-    (0xFF7A, 'M', 'コ'),
-    (0xFF7B, 'M', 'サ'),
-    (0xFF7C, 'M', 'ã‚·'),
-    (0xFF7D, 'M', 'ス'),
-    (0xFF7E, 'M', 'ã‚»'),
-    ]
-
-def _seg_52() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
-    return [
-    (0xFF7F, 'M', 'ソ'),
-    (0xFF80, 'M', 'ã‚¿'),
-    (0xFF81, 'M', 'ãƒ'),
-    (0xFF82, 'M', 'ツ'),
-    (0xFF83, 'M', 'テ'),
-    (0xFF84, 'M', 'ト'),
-    (0xFF85, 'M', 'ナ'),
-    (0xFF86, 'M', 'ニ'),
-    (0xFF87, 'M', 'ヌ'),
-    (0xFF88, 'M', 'ãƒ'),
-    (0xFF89, 'M', 'ノ'),
-    (0xFF8A, 'M', 'ãƒ'),
-    (0xFF8B, 'M', 'ヒ'),
-    (0xFF8C, 'M', 'フ'),
-    (0xFF8D, 'M', 'ヘ'),
-    (0xFF8E, 'M', 'ホ'),
-    (0xFF8F, 'M', 'マ'),
-    (0xFF90, 'M', 'ミ'),
-    (0xFF91, 'M', 'ム'),
-    (0xFF92, 'M', 'メ'),
-    (0xFF93, 'M', 'モ'),
-    (0xFF94, 'M', 'ヤ'),
-    (0xFF95, 'M', 'ユ'),
-    (0xFF96, 'M', 'ヨ'),
-    (0xFF97, 'M', 'ラ'),
-    (0xFF98, 'M', 'リ'),
-    (0xFF99, 'M', 'ル'),
-    (0xFF9A, 'M', 'レ'),
-    (0xFF9B, 'M', 'ロ'),
-    (0xFF9C, 'M', 'ワ'),
-    (0xFF9D, 'M', 'ン'),
-    (0xFF9E, 'M', 'ã‚™'),
-    (0xFF9F, 'M', '゚'),
-    (0xFFA0, 'X'),
-    (0xFFA1, 'M', 'á„€'),
-    (0xFFA2, 'M', 'á„'),
-    (0xFFA3, 'M', 'ᆪ'),
-    (0xFFA4, 'M', 'á„‚'),
-    (0xFFA5, 'M', 'ᆬ'),
-    (0xFFA6, 'M', 'ᆭ'),
-    (0xFFA7, 'M', 'ᄃ'),
-    (0xFFA8, 'M', 'á„„'),
-    (0xFFA9, 'M', 'á„…'),
-    (0xFFAA, 'M', 'ᆰ'),
-    (0xFFAB, 'M', 'ᆱ'),
-    (0xFFAC, 'M', 'ᆲ'),
-    (0xFFAD, 'M', 'ᆳ'),
-    (0xFFAE, 'M', 'ᆴ'),
-    (0xFFAF, 'M', 'ᆵ'),
-    (0xFFB0, 'M', 'ᄚ'),
-    (0xFFB1, 'M', 'ᄆ'),
-    (0xFFB2, 'M', 'ᄇ'),
-    (0xFFB3, 'M', 'ᄈ'),
-    (0xFFB4, 'M', 'á„¡'),
-    (0xFFB5, 'M', 'ᄉ'),
-    (0xFFB6, 'M', 'ᄊ'),
-    (0xFFB7, 'M', 'á„‹'),
-    (0xFFB8, 'M', 'ᄌ'),
-    (0xFFB9, 'M', 'á„'),
-    (0xFFBA, 'M', 'ᄎ'),
-    (0xFFBB, 'M', 'á„'),
-    (0xFFBC, 'M', 'á„'),
-    (0xFFBD, 'M', 'á„‘'),
-    (0xFFBE, 'M', 'á„’'),
-    (0xFFBF, 'X'),
-    (0xFFC2, 'M', 'á…¡'),
-    (0xFFC3, 'M', 'á…¢'),
-    (0xFFC4, 'M', 'á…£'),
-    (0xFFC5, 'M', 'á…¤'),
-    (0xFFC6, 'M', 'á…¥'),
-    (0xFFC7, 'M', 'á…¦'),
-    (0xFFC8, 'X'),
-    (0xFFCA, 'M', 'á…§'),
-    (0xFFCB, 'M', 'á…¨'),
-    (0xFFCC, 'M', 'á…©'),
-    (0xFFCD, 'M', 'á…ª'),
-    (0xFFCE, 'M', 'á…«'),
-    (0xFFCF, 'M', 'á…¬'),
-    (0xFFD0, 'X'),
-    (0xFFD2, 'M', 'á…­'),
-    (0xFFD3, 'M', 'á…®'),
-    (0xFFD4, 'M', 'á…¯'),
-    (0xFFD5, 'M', 'á…°'),
-    (0xFFD6, 'M', 'á…±'),
-    (0xFFD7, 'M', 'á…²'),
-    (0xFFD8, 'X'),
-    (0xFFDA, 'M', 'á…³'),
-    (0xFFDB, 'M', 'á…´'),
-    (0xFFDC, 'M', 'á…µ'),
-    (0xFFDD, 'X'),
-    (0xFFE0, 'M', '¢'),
-    (0xFFE1, 'M', '£'),
-    (0xFFE2, 'M', '¬'),
-    (0xFFE3, '3', ' Ì„'),
-    (0xFFE4, 'M', '¦'),
-    (0xFFE5, 'M', 'Â¥'),
-    (0xFFE6, 'M', 'â‚©'),
-    (0xFFE7, 'X'),
-    (0xFFE8, 'M', '│'),
-    (0xFFE9, 'M', 'â†'),
-    ]
-
-def _seg_53() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
-    return [
-    (0xFFEA, 'M', '↑'),
-    (0xFFEB, 'M', '→'),
-    (0xFFEC, 'M', '↓'),
-    (0xFFED, 'M', 'â– '),
-    (0xFFEE, 'M', 'â—‹'),
-    (0xFFEF, 'X'),
-    (0x10000, 'V'),
-    (0x1000C, 'X'),
-    (0x1000D, 'V'),
-    (0x10027, 'X'),
-    (0x10028, 'V'),
-    (0x1003B, 'X'),
-    (0x1003C, 'V'),
-    (0x1003E, 'X'),
-    (0x1003F, 'V'),
-    (0x1004E, 'X'),
-    (0x10050, 'V'),
-    (0x1005E, 'X'),
-    (0x10080, 'V'),
-    (0x100FB, 'X'),
-    (0x10100, 'V'),
-    (0x10103, 'X'),
-    (0x10107, 'V'),
-    (0x10134, 'X'),
-    (0x10137, 'V'),
-    (0x1018F, 'X'),
-    (0x10190, 'V'),
-    (0x1019D, 'X'),
-    (0x101A0, 'V'),
-    (0x101A1, 'X'),
-    (0x101D0, 'V'),
-    (0x101FE, 'X'),
-    (0x10280, 'V'),
-    (0x1029D, 'X'),
-    (0x102A0, 'V'),
-    (0x102D1, 'X'),
-    (0x102E0, 'V'),
-    (0x102FC, 'X'),
-    (0x10300, 'V'),
-    (0x10324, 'X'),
-    (0x1032D, 'V'),
-    (0x1034B, 'X'),
-    (0x10350, 'V'),
-    (0x1037B, 'X'),
-    (0x10380, 'V'),
-    (0x1039E, 'X'),
-    (0x1039F, 'V'),
-    (0x103C4, 'X'),
-    (0x103C8, 'V'),
-    (0x103D6, 'X'),
-    (0x10400, 'M', 'ð¨'),
-    (0x10401, 'M', 'ð©'),
-    (0x10402, 'M', 'ðª'),
-    (0x10403, 'M', 'ð«'),
-    (0x10404, 'M', 'ð¬'),
-    (0x10405, 'M', 'ð­'),
-    (0x10406, 'M', 'ð®'),
-    (0x10407, 'M', 'ð¯'),
-    (0x10408, 'M', 'ð°'),
-    (0x10409, 'M', 'ð±'),
-    (0x1040A, 'M', 'ð²'),
-    (0x1040B, 'M', 'ð³'),
-    (0x1040C, 'M', 'ð´'),
-    (0x1040D, 'M', 'ðµ'),
-    (0x1040E, 'M', 'ð¶'),
-    (0x1040F, 'M', 'ð·'),
-    (0x10410, 'M', 'ð¸'),
-    (0x10411, 'M', 'ð¹'),
-    (0x10412, 'M', 'ðº'),
-    (0x10413, 'M', 'ð»'),
-    (0x10414, 'M', 'ð¼'),
-    (0x10415, 'M', 'ð½'),
-    (0x10416, 'M', 'ð¾'),
-    (0x10417, 'M', 'ð¿'),
-    (0x10418, 'M', 'ð‘€'),
-    (0x10419, 'M', 'ð‘'),
-    (0x1041A, 'M', 'ð‘‚'),
-    (0x1041B, 'M', 'ð‘ƒ'),
-    (0x1041C, 'M', 'ð‘„'),
-    (0x1041D, 'M', 'ð‘…'),
-    (0x1041E, 'M', 'ð‘†'),
-    (0x1041F, 'M', 'ð‘‡'),
-    (0x10420, 'M', 'ð‘ˆ'),
-    (0x10421, 'M', 'ð‘‰'),
-    (0x10422, 'M', 'ð‘Š'),
-    (0x10423, 'M', 'ð‘‹'),
-    (0x10424, 'M', 'ð‘Œ'),
-    (0x10425, 'M', 'ð‘'),
-    (0x10426, 'M', 'ð‘Ž'),
-    (0x10427, 'M', 'ð‘'),
-    (0x10428, 'V'),
-    (0x1049E, 'X'),
-    (0x104A0, 'V'),
-    (0x104AA, 'X'),
-    (0x104B0, 'M', 'ð“˜'),
-    (0x104B1, 'M', 'ð“™'),
-    (0x104B2, 'M', 'ð“š'),
-    (0x104B3, 'M', 'ð“›'),
-    (0x104B4, 'M', 'ð“œ'),
-    (0x104B5, 'M', 'ð“'),
-    ]
-
-def _seg_54() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
-    return [
-    (0x104B6, 'M', 'ð“ž'),
-    (0x104B7, 'M', 'ð“Ÿ'),
-    (0x104B8, 'M', 'ð“ '),
-    (0x104B9, 'M', 'ð“¡'),
-    (0x104BA, 'M', 'ð“¢'),
-    (0x104BB, 'M', 'ð“£'),
-    (0x104BC, 'M', 'ð“¤'),
-    (0x104BD, 'M', 'ð“¥'),
-    (0x104BE, 'M', 'ð“¦'),
-    (0x104BF, 'M', 'ð“§'),
-    (0x104C0, 'M', 'ð“¨'),
-    (0x104C1, 'M', 'ð“©'),
-    (0x104C2, 'M', 'ð“ª'),
-    (0x104C3, 'M', 'ð“«'),
-    (0x104C4, 'M', 'ð“¬'),
-    (0x104C5, 'M', 'ð“­'),
-    (0x104C6, 'M', 'ð“®'),
-    (0x104C7, 'M', 'ð“¯'),
-    (0x104C8, 'M', 'ð“°'),
-    (0x104C9, 'M', 'ð“±'),
-    (0x104CA, 'M', 'ð“²'),
-    (0x104CB, 'M', 'ð“³'),
-    (0x104CC, 'M', 'ð“´'),
-    (0x104CD, 'M', 'ð“µ'),
-    (0x104CE, 'M', 'ð“¶'),
-    (0x104CF, 'M', 'ð“·'),
-    (0x104D0, 'M', 'ð“¸'),
-    (0x104D1, 'M', 'ð“¹'),
-    (0x104D2, 'M', 'ð“º'),
-    (0x104D3, 'M', 'ð“»'),
-    (0x104D4, 'X'),
-    (0x104D8, 'V'),
-    (0x104FC, 'X'),
-    (0x10500, 'V'),
-    (0x10528, 'X'),
-    (0x10530, 'V'),
-    (0x10564, 'X'),
-    (0x1056F, 'V'),
-    (0x10570, 'M', 'ð–—'),
-    (0x10571, 'M', 'ð–˜'),
-    (0x10572, 'M', 'ð–™'),
-    (0x10573, 'M', 'ð–š'),
-    (0x10574, 'M', 'ð–›'),
-    (0x10575, 'M', 'ð–œ'),
-    (0x10576, 'M', 'ð–'),
-    (0x10577, 'M', 'ð–ž'),
-    (0x10578, 'M', 'ð–Ÿ'),
-    (0x10579, 'M', 'ð– '),
-    (0x1057A, 'M', 'ð–¡'),
-    (0x1057B, 'X'),
-    (0x1057C, 'M', 'ð–£'),
-    (0x1057D, 'M', 'ð–¤'),
-    (0x1057E, 'M', 'ð–¥'),
-    (0x1057F, 'M', 'ð–¦'),
-    (0x10580, 'M', 'ð–§'),
-    (0x10581, 'M', 'ð–¨'),
-    (0x10582, 'M', 'ð–©'),
-    (0x10583, 'M', 'ð–ª'),
-    (0x10584, 'M', 'ð–«'),
-    (0x10585, 'M', 'ð–¬'),
-    (0x10586, 'M', 'ð–­'),
-    (0x10587, 'M', 'ð–®'),
-    (0x10588, 'M', 'ð–¯'),
-    (0x10589, 'M', 'ð–°'),
-    (0x1058A, 'M', 'ð–±'),
-    (0x1058B, 'X'),
-    (0x1058C, 'M', 'ð–³'),
-    (0x1058D, 'M', 'ð–´'),
-    (0x1058E, 'M', 'ð–µ'),
-    (0x1058F, 'M', 'ð–¶'),
-    (0x10590, 'M', 'ð–·'),
-    (0x10591, 'M', 'ð–¸'),
-    (0x10592, 'M', 'ð–¹'),
-    (0x10593, 'X'),
-    (0x10594, 'M', 'ð–»'),
-    (0x10595, 'M', 'ð–¼'),
-    (0x10596, 'X'),
-    (0x10597, 'V'),
-    (0x105A2, 'X'),
-    (0x105A3, 'V'),
-    (0x105B2, 'X'),
-    (0x105B3, 'V'),
-    (0x105BA, 'X'),
-    (0x105BB, 'V'),
-    (0x105BD, 'X'),
-    (0x10600, 'V'),
-    (0x10737, 'X'),
-    (0x10740, 'V'),
-    (0x10756, 'X'),
-    (0x10760, 'V'),
-    (0x10768, 'X'),
-    (0x10780, 'V'),
-    (0x10781, 'M', 'Ë'),
-    (0x10782, 'M', 'Ë‘'),
-    (0x10783, 'M', 'æ'),
-    (0x10784, 'M', 'Ê™'),
-    (0x10785, 'M', 'É“'),
-    (0x10786, 'X'),
-    (0x10787, 'M', 'Ê£'),
-    (0x10788, 'M', 'ê­¦'),
-    ]
-
-def _seg_55() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
-    return [
-    (0x10789, 'M', 'Ê¥'),
-    (0x1078A, 'M', 'ʤ'),
-    (0x1078B, 'M', 'É–'),
-    (0x1078C, 'M', 'É—'),
-    (0x1078D, 'M', 'á¶‘'),
-    (0x1078E, 'M', 'ɘ'),
-    (0x1078F, 'M', 'Éž'),
-    (0x10790, 'M', 'Ê©'),
-    (0x10791, 'M', 'ɤ'),
-    (0x10792, 'M', 'É¢'),
-    (0x10793, 'M', 'É '),
-    (0x10794, 'M', 'Ê›'),
-    (0x10795, 'M', 'ħ'),
-    (0x10796, 'M', 'ʜ'),
-    (0x10797, 'M', 'ɧ'),
-    (0x10798, 'M', 'Ê„'),
-    (0x10799, 'M', 'ʪ'),
-    (0x1079A, 'M', 'Ê«'),
-    (0x1079B, 'M', 'ɬ'),
-    (0x1079C, 'M', 'ð¼„'),
-    (0x1079D, 'M', 'ꞎ'),
-    (0x1079E, 'M', 'É®'),
-    (0x1079F, 'M', 'ð¼…'),
-    (0x107A0, 'M', 'ÊŽ'),
-    (0x107A1, 'M', 'ð¼†'),
-    (0x107A2, 'M', 'ø'),
-    (0x107A3, 'M', 'ɶ'),
-    (0x107A4, 'M', 'É·'),
-    (0x107A5, 'M', 'q'),
-    (0x107A6, 'M', 'ɺ'),
-    (0x107A7, 'M', 'ð¼ˆ'),
-    (0x107A8, 'M', 'ɽ'),
-    (0x107A9, 'M', 'ɾ'),
-    (0x107AA, 'M', 'Ê€'),
-    (0x107AB, 'M', 'ʨ'),
-    (0x107AC, 'M', 'ʦ'),
-    (0x107AD, 'M', 'ê­§'),
-    (0x107AE, 'M', 'ʧ'),
-    (0x107AF, 'M', 'ʈ'),
-    (0x107B0, 'M', 'â±±'),
-    (0x107B1, 'X'),
-    (0x107B2, 'M', 'Ê'),
-    (0x107B3, 'M', 'Ê¡'),
-    (0x107B4, 'M', 'Ê¢'),
-    (0x107B5, 'M', 'ʘ'),
-    (0x107B6, 'M', 'Ç€'),
-    (0x107B7, 'M', 'Ç'),
-    (0x107B8, 'M', 'Ç‚'),
-    (0x107B9, 'M', 'ð¼Š'),
-    (0x107BA, 'M', 'ð¼ž'),
-    (0x107BB, 'X'),
-    (0x10800, 'V'),
-    (0x10806, 'X'),
-    (0x10808, 'V'),
-    (0x10809, 'X'),
-    (0x1080A, 'V'),
-    (0x10836, 'X'),
-    (0x10837, 'V'),
-    (0x10839, 'X'),
-    (0x1083C, 'V'),
-    (0x1083D, 'X'),
-    (0x1083F, 'V'),
-    (0x10856, 'X'),
-    (0x10857, 'V'),
-    (0x1089F, 'X'),
-    (0x108A7, 'V'),
-    (0x108B0, 'X'),
-    (0x108E0, 'V'),
-    (0x108F3, 'X'),
-    (0x108F4, 'V'),
-    (0x108F6, 'X'),
-    (0x108FB, 'V'),
-    (0x1091C, 'X'),
-    (0x1091F, 'V'),
-    (0x1093A, 'X'),
-    (0x1093F, 'V'),
-    (0x10940, 'X'),
-    (0x10980, 'V'),
-    (0x109B8, 'X'),
-    (0x109BC, 'V'),
-    (0x109D0, 'X'),
-    (0x109D2, 'V'),
-    (0x10A04, 'X'),
-    (0x10A05, 'V'),
-    (0x10A07, 'X'),
-    (0x10A0C, 'V'),
-    (0x10A14, 'X'),
-    (0x10A15, 'V'),
-    (0x10A18, 'X'),
-    (0x10A19, 'V'),
-    (0x10A36, 'X'),
-    (0x10A38, 'V'),
-    (0x10A3B, 'X'),
-    (0x10A3F, 'V'),
-    (0x10A49, 'X'),
-    (0x10A50, 'V'),
-    (0x10A59, 'X'),
-    (0x10A60, 'V'),
-    (0x10AA0, 'X'),
-    (0x10AC0, 'V'),
-    ]
-
-def _seg_56() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
-    return [
-    (0x10AE7, 'X'),
-    (0x10AEB, 'V'),
-    (0x10AF7, 'X'),
-    (0x10B00, 'V'),
-    (0x10B36, 'X'),
-    (0x10B39, 'V'),
-    (0x10B56, 'X'),
-    (0x10B58, 'V'),
-    (0x10B73, 'X'),
-    (0x10B78, 'V'),
-    (0x10B92, 'X'),
-    (0x10B99, 'V'),
-    (0x10B9D, 'X'),
-    (0x10BA9, 'V'),
-    (0x10BB0, 'X'),
-    (0x10C00, 'V'),
-    (0x10C49, 'X'),
-    (0x10C80, 'M', 'ð³€'),
-    (0x10C81, 'M', 'ð³'),
-    (0x10C82, 'M', 'ð³‚'),
-    (0x10C83, 'M', 'ð³ƒ'),
-    (0x10C84, 'M', 'ð³„'),
-    (0x10C85, 'M', 'ð³…'),
-    (0x10C86, 'M', 'ð³†'),
-    (0x10C87, 'M', 'ð³‡'),
-    (0x10C88, 'M', 'ð³ˆ'),
-    (0x10C89, 'M', 'ð³‰'),
-    (0x10C8A, 'M', 'ð³Š'),
-    (0x10C8B, 'M', 'ð³‹'),
-    (0x10C8C, 'M', 'ð³Œ'),
-    (0x10C8D, 'M', 'ð³'),
-    (0x10C8E, 'M', 'ð³Ž'),
-    (0x10C8F, 'M', 'ð³'),
-    (0x10C90, 'M', 'ð³'),
-    (0x10C91, 'M', 'ð³‘'),
-    (0x10C92, 'M', 'ð³’'),
-    (0x10C93, 'M', 'ð³“'),
-    (0x10C94, 'M', 'ð³”'),
-    (0x10C95, 'M', 'ð³•'),
-    (0x10C96, 'M', 'ð³–'),
-    (0x10C97, 'M', 'ð³—'),
-    (0x10C98, 'M', 'ð³˜'),
-    (0x10C99, 'M', 'ð³™'),
-    (0x10C9A, 'M', 'ð³š'),
-    (0x10C9B, 'M', 'ð³›'),
-    (0x10C9C, 'M', 'ð³œ'),
-    (0x10C9D, 'M', 'ð³'),
-    (0x10C9E, 'M', 'ð³ž'),
-    (0x10C9F, 'M', 'ð³Ÿ'),
-    (0x10CA0, 'M', 'ð³ '),
-    (0x10CA1, 'M', 'ð³¡'),
-    (0x10CA2, 'M', 'ð³¢'),
-    (0x10CA3, 'M', 'ð³£'),
-    (0x10CA4, 'M', 'ð³¤'),
-    (0x10CA5, 'M', 'ð³¥'),
-    (0x10CA6, 'M', 'ð³¦'),
-    (0x10CA7, 'M', 'ð³§'),
-    (0x10CA8, 'M', 'ð³¨'),
-    (0x10CA9, 'M', 'ð³©'),
-    (0x10CAA, 'M', 'ð³ª'),
-    (0x10CAB, 'M', 'ð³«'),
-    (0x10CAC, 'M', 'ð³¬'),
-    (0x10CAD, 'M', 'ð³­'),
-    (0x10CAE, 'M', 'ð³®'),
-    (0x10CAF, 'M', 'ð³¯'),
-    (0x10CB0, 'M', 'ð³°'),
-    (0x10CB1, 'M', 'ð³±'),
-    (0x10CB2, 'M', 'ð³²'),
-    (0x10CB3, 'X'),
-    (0x10CC0, 'V'),
-    (0x10CF3, 'X'),
-    (0x10CFA, 'V'),
-    (0x10D28, 'X'),
-    (0x10D30, 'V'),
-    (0x10D3A, 'X'),
-    (0x10E60, 'V'),
-    (0x10E7F, 'X'),
-    (0x10E80, 'V'),
-    (0x10EAA, 'X'),
-    (0x10EAB, 'V'),
-    (0x10EAE, 'X'),
-    (0x10EB0, 'V'),
-    (0x10EB2, 'X'),
-    (0x10F00, 'V'),
-    (0x10F28, 'X'),
-    (0x10F30, 'V'),
-    (0x10F5A, 'X'),
-    (0x10F70, 'V'),
-    (0x10F8A, 'X'),
-    (0x10FB0, 'V'),
-    (0x10FCC, 'X'),
-    (0x10FE0, 'V'),
-    (0x10FF7, 'X'),
-    (0x11000, 'V'),
-    (0x1104E, 'X'),
-    (0x11052, 'V'),
-    (0x11076, 'X'),
-    (0x1107F, 'V'),
-    (0x110BD, 'X'),
-    (0x110BE, 'V'),
-    ]
-
-def _seg_57() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
-    return [
-    (0x110C3, 'X'),
-    (0x110D0, 'V'),
-    (0x110E9, 'X'),
-    (0x110F0, 'V'),
-    (0x110FA, 'X'),
-    (0x11100, 'V'),
-    (0x11135, 'X'),
-    (0x11136, 'V'),
-    (0x11148, 'X'),
-    (0x11150, 'V'),
-    (0x11177, 'X'),
-    (0x11180, 'V'),
-    (0x111E0, 'X'),
-    (0x111E1, 'V'),
-    (0x111F5, 'X'),
-    (0x11200, 'V'),
-    (0x11212, 'X'),
-    (0x11213, 'V'),
-    (0x1123F, 'X'),
-    (0x11280, 'V'),
-    (0x11287, 'X'),
-    (0x11288, 'V'),
-    (0x11289, 'X'),
-    (0x1128A, 'V'),
-    (0x1128E, 'X'),
-    (0x1128F, 'V'),
-    (0x1129E, 'X'),
-    (0x1129F, 'V'),
-    (0x112AA, 'X'),
-    (0x112B0, 'V'),
-    (0x112EB, 'X'),
-    (0x112F0, 'V'),
-    (0x112FA, 'X'),
-    (0x11300, 'V'),
-    (0x11304, 'X'),
-    (0x11305, 'V'),
-    (0x1130D, 'X'),
-    (0x1130F, 'V'),
-    (0x11311, 'X'),
-    (0x11313, 'V'),
-    (0x11329, 'X'),
-    (0x1132A, 'V'),
-    (0x11331, 'X'),
-    (0x11332, 'V'),
-    (0x11334, 'X'),
-    (0x11335, 'V'),
-    (0x1133A, 'X'),
-    (0x1133B, 'V'),
-    (0x11345, 'X'),
-    (0x11347, 'V'),
-    (0x11349, 'X'),
-    (0x1134B, 'V'),
-    (0x1134E, 'X'),
-    (0x11350, 'V'),
-    (0x11351, 'X'),
-    (0x11357, 'V'),
-    (0x11358, 'X'),
-    (0x1135D, 'V'),
-    (0x11364, 'X'),
-    (0x11366, 'V'),
-    (0x1136D, 'X'),
-    (0x11370, 'V'),
-    (0x11375, 'X'),
-    (0x11400, 'V'),
-    (0x1145C, 'X'),
-    (0x1145D, 'V'),
-    (0x11462, 'X'),
-    (0x11480, 'V'),
-    (0x114C8, 'X'),
-    (0x114D0, 'V'),
-    (0x114DA, 'X'),
-    (0x11580, 'V'),
-    (0x115B6, 'X'),
-    (0x115B8, 'V'),
-    (0x115DE, 'X'),
-    (0x11600, 'V'),
-    (0x11645, 'X'),
-    (0x11650, 'V'),
-    (0x1165A, 'X'),
-    (0x11660, 'V'),
-    (0x1166D, 'X'),
-    (0x11680, 'V'),
-    (0x116BA, 'X'),
-    (0x116C0, 'V'),
-    (0x116CA, 'X'),
-    (0x11700, 'V'),
-    (0x1171B, 'X'),
-    (0x1171D, 'V'),
-    (0x1172C, 'X'),
-    (0x11730, 'V'),
-    (0x11747, 'X'),
-    (0x11800, 'V'),
-    (0x1183C, 'X'),
-    (0x118A0, 'M', 'ð‘£€'),
-    (0x118A1, 'M', 'ð‘£'),
-    (0x118A2, 'M', '𑣂'),
-    (0x118A3, 'M', '𑣃'),
-    (0x118A4, 'M', '𑣄'),
-    (0x118A5, 'M', 'ð‘£…'),
-    (0x118A6, 'M', '𑣆'),
-    ]
-
-def _seg_58() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
-    return [
-    (0x118A7, 'M', '𑣇'),
-    (0x118A8, 'M', '𑣈'),
-    (0x118A9, 'M', '𑣉'),
-    (0x118AA, 'M', '𑣊'),
-    (0x118AB, 'M', '𑣋'),
-    (0x118AC, 'M', '𑣌'),
-    (0x118AD, 'M', 'ð‘£'),
-    (0x118AE, 'M', '𑣎'),
-    (0x118AF, 'M', 'ð‘£'),
-    (0x118B0, 'M', 'ð‘£'),
-    (0x118B1, 'M', '𑣑'),
-    (0x118B2, 'M', 'ð‘£’'),
-    (0x118B3, 'M', '𑣓'),
-    (0x118B4, 'M', 'ð‘£”'),
-    (0x118B5, 'M', '𑣕'),
-    (0x118B6, 'M', 'ð‘£–'),
-    (0x118B7, 'M', 'ð‘£—'),
-    (0x118B8, 'M', '𑣘'),
-    (0x118B9, 'M', 'ð‘£™'),
-    (0x118BA, 'M', '𑣚'),
-    (0x118BB, 'M', 'ð‘£›'),
-    (0x118BC, 'M', '𑣜'),
-    (0x118BD, 'M', 'ð‘£'),
-    (0x118BE, 'M', '𑣞'),
-    (0x118BF, 'M', '𑣟'),
-    (0x118C0, 'V'),
-    (0x118F3, 'X'),
-    (0x118FF, 'V'),
-    (0x11907, 'X'),
-    (0x11909, 'V'),
-    (0x1190A, 'X'),
-    (0x1190C, 'V'),
-    (0x11914, 'X'),
-    (0x11915, 'V'),
-    (0x11917, 'X'),
-    (0x11918, 'V'),
-    (0x11936, 'X'),
-    (0x11937, 'V'),
-    (0x11939, 'X'),
-    (0x1193B, 'V'),
-    (0x11947, 'X'),
-    (0x11950, 'V'),
-    (0x1195A, 'X'),
-    (0x119A0, 'V'),
-    (0x119A8, 'X'),
-    (0x119AA, 'V'),
-    (0x119D8, 'X'),
-    (0x119DA, 'V'),
-    (0x119E5, 'X'),
-    (0x11A00, 'V'),
-    (0x11A48, 'X'),
-    (0x11A50, 'V'),
-    (0x11AA3, 'X'),
-    (0x11AB0, 'V'),
-    (0x11AF9, 'X'),
-    (0x11C00, 'V'),
-    (0x11C09, 'X'),
-    (0x11C0A, 'V'),
-    (0x11C37, 'X'),
-    (0x11C38, 'V'),
-    (0x11C46, 'X'),
-    (0x11C50, 'V'),
-    (0x11C6D, 'X'),
-    (0x11C70, 'V'),
-    (0x11C90, 'X'),
-    (0x11C92, 'V'),
-    (0x11CA8, 'X'),
-    (0x11CA9, 'V'),
-    (0x11CB7, 'X'),
-    (0x11D00, 'V'),
-    (0x11D07, 'X'),
-    (0x11D08, 'V'),
-    (0x11D0A, 'X'),
-    (0x11D0B, 'V'),
-    (0x11D37, 'X'),
-    (0x11D3A, 'V'),
-    (0x11D3B, 'X'),
-    (0x11D3C, 'V'),
-    (0x11D3E, 'X'),
-    (0x11D3F, 'V'),
-    (0x11D48, 'X'),
-    (0x11D50, 'V'),
-    (0x11D5A, 'X'),
-    (0x11D60, 'V'),
-    (0x11D66, 'X'),
-    (0x11D67, 'V'),
-    (0x11D69, 'X'),
-    (0x11D6A, 'V'),
-    (0x11D8F, 'X'),
-    (0x11D90, 'V'),
-    (0x11D92, 'X'),
-    (0x11D93, 'V'),
-    (0x11D99, 'X'),
-    (0x11DA0, 'V'),
-    (0x11DAA, 'X'),
-    (0x11EE0, 'V'),
-    (0x11EF9, 'X'),
-    (0x11FB0, 'V'),
-    (0x11FB1, 'X'),
-    (0x11FC0, 'V'),
-    ]
-
-def _seg_59() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
-    return [
-    (0x11FF2, 'X'),
-    (0x11FFF, 'V'),
-    (0x1239A, 'X'),
-    (0x12400, 'V'),
-    (0x1246F, 'X'),
-    (0x12470, 'V'),
-    (0x12475, 'X'),
-    (0x12480, 'V'),
-    (0x12544, 'X'),
-    (0x12F90, 'V'),
-    (0x12FF3, 'X'),
-    (0x13000, 'V'),
-    (0x1342F, 'X'),
-    (0x14400, 'V'),
-    (0x14647, 'X'),
-    (0x16800, 'V'),
-    (0x16A39, 'X'),
-    (0x16A40, 'V'),
-    (0x16A5F, 'X'),
-    (0x16A60, 'V'),
-    (0x16A6A, 'X'),
-    (0x16A6E, 'V'),
-    (0x16ABF, 'X'),
-    (0x16AC0, 'V'),
-    (0x16ACA, 'X'),
-    (0x16AD0, 'V'),
-    (0x16AEE, 'X'),
-    (0x16AF0, 'V'),
-    (0x16AF6, 'X'),
-    (0x16B00, 'V'),
-    (0x16B46, 'X'),
-    (0x16B50, 'V'),
-    (0x16B5A, 'X'),
-    (0x16B5B, 'V'),
-    (0x16B62, 'X'),
-    (0x16B63, 'V'),
-    (0x16B78, 'X'),
-    (0x16B7D, 'V'),
-    (0x16B90, 'X'),
-    (0x16E40, 'M', 'ð–¹ '),
-    (0x16E41, 'M', '𖹡'),
-    (0x16E42, 'M', 'ð–¹¢'),
-    (0x16E43, 'M', 'ð–¹£'),
-    (0x16E44, 'M', '𖹤'),
-    (0x16E45, 'M', 'ð–¹¥'),
-    (0x16E46, 'M', '𖹦'),
-    (0x16E47, 'M', 'ð–¹§'),
-    (0x16E48, 'M', '𖹨'),
-    (0x16E49, 'M', '𖹩'),
-    (0x16E4A, 'M', '𖹪'),
-    (0x16E4B, 'M', '𖹫'),
-    (0x16E4C, 'M', '𖹬'),
-    (0x16E4D, 'M', 'ð–¹­'),
-    (0x16E4E, 'M', 'ð–¹®'),
-    (0x16E4F, 'M', '𖹯'),
-    (0x16E50, 'M', 'ð–¹°'),
-    (0x16E51, 'M', 'ð–¹±'),
-    (0x16E52, 'M', 'ð–¹²'),
-    (0x16E53, 'M', 'ð–¹³'),
-    (0x16E54, 'M', 'ð–¹´'),
-    (0x16E55, 'M', 'ð–¹µ'),
-    (0x16E56, 'M', 'ð–¹¶'),
-    (0x16E57, 'M', 'ð–¹·'),
-    (0x16E58, 'M', '𖹸'),
-    (0x16E59, 'M', 'ð–¹¹'),
-    (0x16E5A, 'M', '𖹺'),
-    (0x16E5B, 'M', 'ð–¹»'),
-    (0x16E5C, 'M', 'ð–¹¼'),
-    (0x16E5D, 'M', 'ð–¹½'),
-    (0x16E5E, 'M', 'ð–¹¾'),
-    (0x16E5F, 'M', '𖹿'),
-    (0x16E60, 'V'),
-    (0x16E9B, 'X'),
-    (0x16F00, 'V'),
-    (0x16F4B, 'X'),
-    (0x16F4F, 'V'),
-    (0x16F88, 'X'),
-    (0x16F8F, 'V'),
-    (0x16FA0, 'X'),
-    (0x16FE0, 'V'),
-    (0x16FE5, 'X'),
-    (0x16FF0, 'V'),
-    (0x16FF2, 'X'),
-    (0x17000, 'V'),
-    (0x187F8, 'X'),
-    (0x18800, 'V'),
-    (0x18CD6, 'X'),
-    (0x18D00, 'V'),
-    (0x18D09, 'X'),
-    (0x1AFF0, 'V'),
-    (0x1AFF4, 'X'),
-    (0x1AFF5, 'V'),
-    (0x1AFFC, 'X'),
-    (0x1AFFD, 'V'),
-    (0x1AFFF, 'X'),
-    (0x1B000, 'V'),
-    (0x1B123, 'X'),
-    (0x1B150, 'V'),
-    (0x1B153, 'X'),
-    (0x1B164, 'V'),
-    ]
-
-def _seg_60() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
-    return [
-    (0x1B168, 'X'),
-    (0x1B170, 'V'),
-    (0x1B2FC, 'X'),
-    (0x1BC00, 'V'),
-    (0x1BC6B, 'X'),
-    (0x1BC70, 'V'),
-    (0x1BC7D, 'X'),
-    (0x1BC80, 'V'),
-    (0x1BC89, 'X'),
-    (0x1BC90, 'V'),
-    (0x1BC9A, 'X'),
-    (0x1BC9C, 'V'),
-    (0x1BCA0, 'I'),
-    (0x1BCA4, 'X'),
-    (0x1CF00, 'V'),
-    (0x1CF2E, 'X'),
-    (0x1CF30, 'V'),
-    (0x1CF47, 'X'),
-    (0x1CF50, 'V'),
-    (0x1CFC4, 'X'),
-    (0x1D000, 'V'),
-    (0x1D0F6, 'X'),
-    (0x1D100, 'V'),
-    (0x1D127, 'X'),
-    (0x1D129, 'V'),
-    (0x1D15E, 'M', 'ð…—ð…¥'),
-    (0x1D15F, 'M', 'ð…˜ð…¥'),
-    (0x1D160, 'M', 'ð…˜ð…¥ð…®'),
-    (0x1D161, 'M', 'ð…˜ð…¥ð…¯'),
-    (0x1D162, 'M', 'ð…˜ð…¥ð…°'),
-    (0x1D163, 'M', 'ð…˜ð…¥ð…±'),
-    (0x1D164, 'M', 'ð…˜ð…¥ð…²'),
-    (0x1D165, 'V'),
-    (0x1D173, 'X'),
-    (0x1D17B, 'V'),
-    (0x1D1BB, 'M', 'ð†¹ð…¥'),
-    (0x1D1BC, 'M', 'ð†ºð…¥'),
-    (0x1D1BD, 'M', 'ð†¹ð…¥ð…®'),
-    (0x1D1BE, 'M', 'ð†ºð…¥ð…®'),
-    (0x1D1BF, 'M', 'ð†¹ð…¥ð…¯'),
-    (0x1D1C0, 'M', 'ð†ºð…¥ð…¯'),
-    (0x1D1C1, 'V'),
-    (0x1D1EB, 'X'),
-    (0x1D200, 'V'),
-    (0x1D246, 'X'),
-    (0x1D2E0, 'V'),
-    (0x1D2F4, 'X'),
-    (0x1D300, 'V'),
-    (0x1D357, 'X'),
-    (0x1D360, 'V'),
-    (0x1D379, 'X'),
-    (0x1D400, 'M', 'a'),
-    (0x1D401, 'M', 'b'),
-    (0x1D402, 'M', 'c'),
-    (0x1D403, 'M', 'd'),
-    (0x1D404, 'M', 'e'),
-    (0x1D405, 'M', 'f'),
-    (0x1D406, 'M', 'g'),
-    (0x1D407, 'M', 'h'),
-    (0x1D408, 'M', 'i'),
-    (0x1D409, 'M', 'j'),
-    (0x1D40A, 'M', 'k'),
-    (0x1D40B, 'M', 'l'),
-    (0x1D40C, 'M', 'm'),
-    (0x1D40D, 'M', 'n'),
-    (0x1D40E, 'M', 'o'),
-    (0x1D40F, 'M', 'p'),
-    (0x1D410, 'M', 'q'),
-    (0x1D411, 'M', 'r'),
-    (0x1D412, 'M', 's'),
-    (0x1D413, 'M', 't'),
-    (0x1D414, 'M', 'u'),
-    (0x1D415, 'M', 'v'),
-    (0x1D416, 'M', 'w'),
-    (0x1D417, 'M', 'x'),
-    (0x1D418, 'M', 'y'),
-    (0x1D419, 'M', 'z'),
-    (0x1D41A, 'M', 'a'),
-    (0x1D41B, 'M', 'b'),
-    (0x1D41C, 'M', 'c'),
-    (0x1D41D, 'M', 'd'),
-    (0x1D41E, 'M', 'e'),
-    (0x1D41F, 'M', 'f'),
-    (0x1D420, 'M', 'g'),
-    (0x1D421, 'M', 'h'),
-    (0x1D422, 'M', 'i'),
-    (0x1D423, 'M', 'j'),
-    (0x1D424, 'M', 'k'),
-    (0x1D425, 'M', 'l'),
-    (0x1D426, 'M', 'm'),
-    (0x1D427, 'M', 'n'),
-    (0x1D428, 'M', 'o'),
-    (0x1D429, 'M', 'p'),
-    (0x1D42A, 'M', 'q'),
-    (0x1D42B, 'M', 'r'),
-    (0x1D42C, 'M', 's'),
-    (0x1D42D, 'M', 't'),
-    (0x1D42E, 'M', 'u'),
-    (0x1D42F, 'M', 'v'),
-    (0x1D430, 'M', 'w'),
-    ]
-
-def _seg_61() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
-    return [
-    (0x1D431, 'M', 'x'),
-    (0x1D432, 'M', 'y'),
-    (0x1D433, 'M', 'z'),
-    (0x1D434, 'M', 'a'),
-    (0x1D435, 'M', 'b'),
-    (0x1D436, 'M', 'c'),
-    (0x1D437, 'M', 'd'),
-    (0x1D438, 'M', 'e'),
-    (0x1D439, 'M', 'f'),
-    (0x1D43A, 'M', 'g'),
-    (0x1D43B, 'M', 'h'),
-    (0x1D43C, 'M', 'i'),
-    (0x1D43D, 'M', 'j'),
-    (0x1D43E, 'M', 'k'),
-    (0x1D43F, 'M', 'l'),
-    (0x1D440, 'M', 'm'),
-    (0x1D441, 'M', 'n'),
-    (0x1D442, 'M', 'o'),
-    (0x1D443, 'M', 'p'),
-    (0x1D444, 'M', 'q'),
-    (0x1D445, 'M', 'r'),
-    (0x1D446, 'M', 's'),
-    (0x1D447, 'M', 't'),
-    (0x1D448, 'M', 'u'),
-    (0x1D449, 'M', 'v'),
-    (0x1D44A, 'M', 'w'),
-    (0x1D44B, 'M', 'x'),
-    (0x1D44C, 'M', 'y'),
-    (0x1D44D, 'M', 'z'),
-    (0x1D44E, 'M', 'a'),
-    (0x1D44F, 'M', 'b'),
-    (0x1D450, 'M', 'c'),
-    (0x1D451, 'M', 'd'),
-    (0x1D452, 'M', 'e'),
-    (0x1D453, 'M', 'f'),
-    (0x1D454, 'M', 'g'),
-    (0x1D455, 'X'),
-    (0x1D456, 'M', 'i'),
-    (0x1D457, 'M', 'j'),
-    (0x1D458, 'M', 'k'),
-    (0x1D459, 'M', 'l'),
-    (0x1D45A, 'M', 'm'),
-    (0x1D45B, 'M', 'n'),
-    (0x1D45C, 'M', 'o'),
-    (0x1D45D, 'M', 'p'),
-    (0x1D45E, 'M', 'q'),
-    (0x1D45F, 'M', 'r'),
-    (0x1D460, 'M', 's'),
-    (0x1D461, 'M', 't'),
-    (0x1D462, 'M', 'u'),
-    (0x1D463, 'M', 'v'),
-    (0x1D464, 'M', 'w'),
-    (0x1D465, 'M', 'x'),
-    (0x1D466, 'M', 'y'),
-    (0x1D467, 'M', 'z'),
-    (0x1D468, 'M', 'a'),
-    (0x1D469, 'M', 'b'),
-    (0x1D46A, 'M', 'c'),
-    (0x1D46B, 'M', 'd'),
-    (0x1D46C, 'M', 'e'),
-    (0x1D46D, 'M', 'f'),
-    (0x1D46E, 'M', 'g'),
-    (0x1D46F, 'M', 'h'),
-    (0x1D470, 'M', 'i'),
-    (0x1D471, 'M', 'j'),
-    (0x1D472, 'M', 'k'),
-    (0x1D473, 'M', 'l'),
-    (0x1D474, 'M', 'm'),
-    (0x1D475, 'M', 'n'),
-    (0x1D476, 'M', 'o'),
-    (0x1D477, 'M', 'p'),
-    (0x1D478, 'M', 'q'),
-    (0x1D479, 'M', 'r'),
-    (0x1D47A, 'M', 's'),
-    (0x1D47B, 'M', 't'),
-    (0x1D47C, 'M', 'u'),
-    (0x1D47D, 'M', 'v'),
-    (0x1D47E, 'M', 'w'),
-    (0x1D47F, 'M', 'x'),
-    (0x1D480, 'M', 'y'),
-    (0x1D481, 'M', 'z'),
-    (0x1D482, 'M', 'a'),
-    (0x1D483, 'M', 'b'),
-    (0x1D484, 'M', 'c'),
-    (0x1D485, 'M', 'd'),
-    (0x1D486, 'M', 'e'),
-    (0x1D487, 'M', 'f'),
-    (0x1D488, 'M', 'g'),
-    (0x1D489, 'M', 'h'),
-    (0x1D48A, 'M', 'i'),
-    (0x1D48B, 'M', 'j'),
-    (0x1D48C, 'M', 'k'),
-    (0x1D48D, 'M', 'l'),
-    (0x1D48E, 'M', 'm'),
-    (0x1D48F, 'M', 'n'),
-    (0x1D490, 'M', 'o'),
-    (0x1D491, 'M', 'p'),
-    (0x1D492, 'M', 'q'),
-    (0x1D493, 'M', 'r'),
-    (0x1D494, 'M', 's'),
-    ]
-
-def _seg_62() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
-    return [
-    (0x1D495, 'M', 't'),
-    (0x1D496, 'M', 'u'),
-    (0x1D497, 'M', 'v'),
-    (0x1D498, 'M', 'w'),
-    (0x1D499, 'M', 'x'),
-    (0x1D49A, 'M', 'y'),
-    (0x1D49B, 'M', 'z'),
-    (0x1D49C, 'M', 'a'),
-    (0x1D49D, 'X'),
-    (0x1D49E, 'M', 'c'),
-    (0x1D49F, 'M', 'd'),
-    (0x1D4A0, 'X'),
-    (0x1D4A2, 'M', 'g'),
-    (0x1D4A3, 'X'),
-    (0x1D4A5, 'M', 'j'),
-    (0x1D4A6, 'M', 'k'),
-    (0x1D4A7, 'X'),
-    (0x1D4A9, 'M', 'n'),
-    (0x1D4AA, 'M', 'o'),
-    (0x1D4AB, 'M', 'p'),
-    (0x1D4AC, 'M', 'q'),
-    (0x1D4AD, 'X'),
-    (0x1D4AE, 'M', 's'),
-    (0x1D4AF, 'M', 't'),
-    (0x1D4B0, 'M', 'u'),
-    (0x1D4B1, 'M', 'v'),
-    (0x1D4B2, 'M', 'w'),
-    (0x1D4B3, 'M', 'x'),
-    (0x1D4B4, 'M', 'y'),
-    (0x1D4B5, 'M', 'z'),
-    (0x1D4B6, 'M', 'a'),
-    (0x1D4B7, 'M', 'b'),
-    (0x1D4B8, 'M', 'c'),
-    (0x1D4B9, 'M', 'd'),
-    (0x1D4BA, 'X'),
-    (0x1D4BB, 'M', 'f'),
-    (0x1D4BC, 'X'),
-    (0x1D4BD, 'M', 'h'),
-    (0x1D4BE, 'M', 'i'),
-    (0x1D4BF, 'M', 'j'),
-    (0x1D4C0, 'M', 'k'),
-    (0x1D4C1, 'M', 'l'),
-    (0x1D4C2, 'M', 'm'),
-    (0x1D4C3, 'M', 'n'),
-    (0x1D4C4, 'X'),
-    (0x1D4C5, 'M', 'p'),
-    (0x1D4C6, 'M', 'q'),
-    (0x1D4C7, 'M', 'r'),
-    (0x1D4C8, 'M', 's'),
-    (0x1D4C9, 'M', 't'),
-    (0x1D4CA, 'M', 'u'),
-    (0x1D4CB, 'M', 'v'),
-    (0x1D4CC, 'M', 'w'),
-    (0x1D4CD, 'M', 'x'),
-    (0x1D4CE, 'M', 'y'),
-    (0x1D4CF, 'M', 'z'),
-    (0x1D4D0, 'M', 'a'),
-    (0x1D4D1, 'M', 'b'),
-    (0x1D4D2, 'M', 'c'),
-    (0x1D4D3, 'M', 'd'),
-    (0x1D4D4, 'M', 'e'),
-    (0x1D4D5, 'M', 'f'),
-    (0x1D4D6, 'M', 'g'),
-    (0x1D4D7, 'M', 'h'),
-    (0x1D4D8, 'M', 'i'),
-    (0x1D4D9, 'M', 'j'),
-    (0x1D4DA, 'M', 'k'),
-    (0x1D4DB, 'M', 'l'),
-    (0x1D4DC, 'M', 'm'),
-    (0x1D4DD, 'M', 'n'),
-    (0x1D4DE, 'M', 'o'),
-    (0x1D4DF, 'M', 'p'),
-    (0x1D4E0, 'M', 'q'),
-    (0x1D4E1, 'M', 'r'),
-    (0x1D4E2, 'M', 's'),
-    (0x1D4E3, 'M', 't'),
-    (0x1D4E4, 'M', 'u'),
-    (0x1D4E5, 'M', 'v'),
-    (0x1D4E6, 'M', 'w'),
-    (0x1D4E7, 'M', 'x'),
-    (0x1D4E8, 'M', 'y'),
-    (0x1D4E9, 'M', 'z'),
-    (0x1D4EA, 'M', 'a'),
-    (0x1D4EB, 'M', 'b'),
-    (0x1D4EC, 'M', 'c'),
-    (0x1D4ED, 'M', 'd'),
-    (0x1D4EE, 'M', 'e'),
-    (0x1D4EF, 'M', 'f'),
-    (0x1D4F0, 'M', 'g'),
-    (0x1D4F1, 'M', 'h'),
-    (0x1D4F2, 'M', 'i'),
-    (0x1D4F3, 'M', 'j'),
-    (0x1D4F4, 'M', 'k'),
-    (0x1D4F5, 'M', 'l'),
-    (0x1D4F6, 'M', 'm'),
-    (0x1D4F7, 'M', 'n'),
-    (0x1D4F8, 'M', 'o'),
-    (0x1D4F9, 'M', 'p'),
-    (0x1D4FA, 'M', 'q'),
-    (0x1D4FB, 'M', 'r'),
-    ]
-
-def _seg_63() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
-    return [
-    (0x1D4FC, 'M', 's'),
-    (0x1D4FD, 'M', 't'),
-    (0x1D4FE, 'M', 'u'),
-    (0x1D4FF, 'M', 'v'),
-    (0x1D500, 'M', 'w'),
-    (0x1D501, 'M', 'x'),
-    (0x1D502, 'M', 'y'),
-    (0x1D503, 'M', 'z'),
-    (0x1D504, 'M', 'a'),
-    (0x1D505, 'M', 'b'),
-    (0x1D506, 'X'),
-    (0x1D507, 'M', 'd'),
-    (0x1D508, 'M', 'e'),
-    (0x1D509, 'M', 'f'),
-    (0x1D50A, 'M', 'g'),
-    (0x1D50B, 'X'),
-    (0x1D50D, 'M', 'j'),
-    (0x1D50E, 'M', 'k'),
-    (0x1D50F, 'M', 'l'),
-    (0x1D510, 'M', 'm'),
-    (0x1D511, 'M', 'n'),
-    (0x1D512, 'M', 'o'),
-    (0x1D513, 'M', 'p'),
-    (0x1D514, 'M', 'q'),
-    (0x1D515, 'X'),
-    (0x1D516, 'M', 's'),
-    (0x1D517, 'M', 't'),
-    (0x1D518, 'M', 'u'),
-    (0x1D519, 'M', 'v'),
-    (0x1D51A, 'M', 'w'),
-    (0x1D51B, 'M', 'x'),
-    (0x1D51C, 'M', 'y'),
-    (0x1D51D, 'X'),
-    (0x1D51E, 'M', 'a'),
-    (0x1D51F, 'M', 'b'),
-    (0x1D520, 'M', 'c'),
-    (0x1D521, 'M', 'd'),
-    (0x1D522, 'M', 'e'),
-    (0x1D523, 'M', 'f'),
-    (0x1D524, 'M', 'g'),
-    (0x1D525, 'M', 'h'),
-    (0x1D526, 'M', 'i'),
-    (0x1D527, 'M', 'j'),
-    (0x1D528, 'M', 'k'),
-    (0x1D529, 'M', 'l'),
-    (0x1D52A, 'M', 'm'),
-    (0x1D52B, 'M', 'n'),
-    (0x1D52C, 'M', 'o'),
-    (0x1D52D, 'M', 'p'),
-    (0x1D52E, 'M', 'q'),
-    (0x1D52F, 'M', 'r'),
-    (0x1D530, 'M', 's'),
-    (0x1D531, 'M', 't'),
-    (0x1D532, 'M', 'u'),
-    (0x1D533, 'M', 'v'),
-    (0x1D534, 'M', 'w'),
-    (0x1D535, 'M', 'x'),
-    (0x1D536, 'M', 'y'),
-    (0x1D537, 'M', 'z'),
-    (0x1D538, 'M', 'a'),
-    (0x1D539, 'M', 'b'),
-    (0x1D53A, 'X'),
-    (0x1D53B, 'M', 'd'),
-    (0x1D53C, 'M', 'e'),
-    (0x1D53D, 'M', 'f'),
-    (0x1D53E, 'M', 'g'),
-    (0x1D53F, 'X'),
-    (0x1D540, 'M', 'i'),
-    (0x1D541, 'M', 'j'),
-    (0x1D542, 'M', 'k'),
-    (0x1D543, 'M', 'l'),
-    (0x1D544, 'M', 'm'),
-    (0x1D545, 'X'),
-    (0x1D546, 'M', 'o'),
-    (0x1D547, 'X'),
-    (0x1D54A, 'M', 's'),
-    (0x1D54B, 'M', 't'),
-    (0x1D54C, 'M', 'u'),
-    (0x1D54D, 'M', 'v'),
-    (0x1D54E, 'M', 'w'),
-    (0x1D54F, 'M', 'x'),
-    (0x1D550, 'M', 'y'),
-    (0x1D551, 'X'),
-    (0x1D552, 'M', 'a'),
-    (0x1D553, 'M', 'b'),
-    (0x1D554, 'M', 'c'),
-    (0x1D555, 'M', 'd'),
-    (0x1D556, 'M', 'e'),
-    (0x1D557, 'M', 'f'),
-    (0x1D558, 'M', 'g'),
-    (0x1D559, 'M', 'h'),
-    (0x1D55A, 'M', 'i'),
-    (0x1D55B, 'M', 'j'),
-    (0x1D55C, 'M', 'k'),
-    (0x1D55D, 'M', 'l'),
-    (0x1D55E, 'M', 'm'),
-    (0x1D55F, 'M', 'n'),
-    (0x1D560, 'M', 'o'),
-    (0x1D561, 'M', 'p'),
-    (0x1D562, 'M', 'q'),
-    ]
-
-def _seg_64() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
-    return [
-    (0x1D563, 'M', 'r'),
-    (0x1D564, 'M', 's'),
-    (0x1D565, 'M', 't'),
-    (0x1D566, 'M', 'u'),
-    (0x1D567, 'M', 'v'),
-    (0x1D568, 'M', 'w'),
-    (0x1D569, 'M', 'x'),
-    (0x1D56A, 'M', 'y'),
-    (0x1D56B, 'M', 'z'),
-    (0x1D56C, 'M', 'a'),
-    (0x1D56D, 'M', 'b'),
-    (0x1D56E, 'M', 'c'),
-    (0x1D56F, 'M', 'd'),
-    (0x1D570, 'M', 'e'),
-    (0x1D571, 'M', 'f'),
-    (0x1D572, 'M', 'g'),
-    (0x1D573, 'M', 'h'),
-    (0x1D574, 'M', 'i'),
-    (0x1D575, 'M', 'j'),
-    (0x1D576, 'M', 'k'),
-    (0x1D577, 'M', 'l'),
-    (0x1D578, 'M', 'm'),
-    (0x1D579, 'M', 'n'),
-    (0x1D57A, 'M', 'o'),
-    (0x1D57B, 'M', 'p'),
-    (0x1D57C, 'M', 'q'),
-    (0x1D57D, 'M', 'r'),
-    (0x1D57E, 'M', 's'),
-    (0x1D57F, 'M', 't'),
-    (0x1D580, 'M', 'u'),
-    (0x1D581, 'M', 'v'),
-    (0x1D582, 'M', 'w'),
-    (0x1D583, 'M', 'x'),
-    (0x1D584, 'M', 'y'),
-    (0x1D585, 'M', 'z'),
-    (0x1D586, 'M', 'a'),
-    (0x1D587, 'M', 'b'),
-    (0x1D588, 'M', 'c'),
-    (0x1D589, 'M', 'd'),
-    (0x1D58A, 'M', 'e'),
-    (0x1D58B, 'M', 'f'),
-    (0x1D58C, 'M', 'g'),
-    (0x1D58D, 'M', 'h'),
-    (0x1D58E, 'M', 'i'),
-    (0x1D58F, 'M', 'j'),
-    (0x1D590, 'M', 'k'),
-    (0x1D591, 'M', 'l'),
-    (0x1D592, 'M', 'm'),
-    (0x1D593, 'M', 'n'),
-    (0x1D594, 'M', 'o'),
-    (0x1D595, 'M', 'p'),
-    (0x1D596, 'M', 'q'),
-    (0x1D597, 'M', 'r'),
-    (0x1D598, 'M', 's'),
-    (0x1D599, 'M', 't'),
-    (0x1D59A, 'M', 'u'),
-    (0x1D59B, 'M', 'v'),
-    (0x1D59C, 'M', 'w'),
-    (0x1D59D, 'M', 'x'),
-    (0x1D59E, 'M', 'y'),
-    (0x1D59F, 'M', 'z'),
-    (0x1D5A0, 'M', 'a'),
-    (0x1D5A1, 'M', 'b'),
-    (0x1D5A2, 'M', 'c'),
-    (0x1D5A3, 'M', 'd'),
-    (0x1D5A4, 'M', 'e'),
-    (0x1D5A5, 'M', 'f'),
-    (0x1D5A6, 'M', 'g'),
-    (0x1D5A7, 'M', 'h'),
-    (0x1D5A8, 'M', 'i'),
-    (0x1D5A9, 'M', 'j'),
-    (0x1D5AA, 'M', 'k'),
-    (0x1D5AB, 'M', 'l'),
-    (0x1D5AC, 'M', 'm'),
-    (0x1D5AD, 'M', 'n'),
-    (0x1D5AE, 'M', 'o'),
-    (0x1D5AF, 'M', 'p'),
-    (0x1D5B0, 'M', 'q'),
-    (0x1D5B1, 'M', 'r'),
-    (0x1D5B2, 'M', 's'),
-    (0x1D5B3, 'M', 't'),
-    (0x1D5B4, 'M', 'u'),
-    (0x1D5B5, 'M', 'v'),
-    (0x1D5B6, 'M', 'w'),
-    (0x1D5B7, 'M', 'x'),
-    (0x1D5B8, 'M', 'y'),
-    (0x1D5B9, 'M', 'z'),
-    (0x1D5BA, 'M', 'a'),
-    (0x1D5BB, 'M', 'b'),
-    (0x1D5BC, 'M', 'c'),
-    (0x1D5BD, 'M', 'd'),
-    (0x1D5BE, 'M', 'e'),
-    (0x1D5BF, 'M', 'f'),
-    (0x1D5C0, 'M', 'g'),
-    (0x1D5C1, 'M', 'h'),
-    (0x1D5C2, 'M', 'i'),
-    (0x1D5C3, 'M', 'j'),
-    (0x1D5C4, 'M', 'k'),
-    (0x1D5C5, 'M', 'l'),
-    (0x1D5C6, 'M', 'm'),
-    ]
-
-def _seg_65() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
-    return [
-    (0x1D5C7, 'M', 'n'),
-    (0x1D5C8, 'M', 'o'),
-    (0x1D5C9, 'M', 'p'),
-    (0x1D5CA, 'M', 'q'),
-    (0x1D5CB, 'M', 'r'),
-    (0x1D5CC, 'M', 's'),
-    (0x1D5CD, 'M', 't'),
-    (0x1D5CE, 'M', 'u'),
-    (0x1D5CF, 'M', 'v'),
-    (0x1D5D0, 'M', 'w'),
-    (0x1D5D1, 'M', 'x'),
-    (0x1D5D2, 'M', 'y'),
-    (0x1D5D3, 'M', 'z'),
-    (0x1D5D4, 'M', 'a'),
-    (0x1D5D5, 'M', 'b'),
-    (0x1D5D6, 'M', 'c'),
-    (0x1D5D7, 'M', 'd'),
-    (0x1D5D8, 'M', 'e'),
-    (0x1D5D9, 'M', 'f'),
-    (0x1D5DA, 'M', 'g'),
-    (0x1D5DB, 'M', 'h'),
-    (0x1D5DC, 'M', 'i'),
-    (0x1D5DD, 'M', 'j'),
-    (0x1D5DE, 'M', 'k'),
-    (0x1D5DF, 'M', 'l'),
-    (0x1D5E0, 'M', 'm'),
-    (0x1D5E1, 'M', 'n'),
-    (0x1D5E2, 'M', 'o'),
-    (0x1D5E3, 'M', 'p'),
-    (0x1D5E4, 'M', 'q'),
-    (0x1D5E5, 'M', 'r'),
-    (0x1D5E6, 'M', 's'),
-    (0x1D5E7, 'M', 't'),
-    (0x1D5E8, 'M', 'u'),
-    (0x1D5E9, 'M', 'v'),
-    (0x1D5EA, 'M', 'w'),
-    (0x1D5EB, 'M', 'x'),
-    (0x1D5EC, 'M', 'y'),
-    (0x1D5ED, 'M', 'z'),
-    (0x1D5EE, 'M', 'a'),
-    (0x1D5EF, 'M', 'b'),
-    (0x1D5F0, 'M', 'c'),
-    (0x1D5F1, 'M', 'd'),
-    (0x1D5F2, 'M', 'e'),
-    (0x1D5F3, 'M', 'f'),
-    (0x1D5F4, 'M', 'g'),
-    (0x1D5F5, 'M', 'h'),
-    (0x1D5F6, 'M', 'i'),
-    (0x1D5F7, 'M', 'j'),
-    (0x1D5F8, 'M', 'k'),
-    (0x1D5F9, 'M', 'l'),
-    (0x1D5FA, 'M', 'm'),
-    (0x1D5FB, 'M', 'n'),
-    (0x1D5FC, 'M', 'o'),
-    (0x1D5FD, 'M', 'p'),
-    (0x1D5FE, 'M', 'q'),
-    (0x1D5FF, 'M', 'r'),
-    (0x1D600, 'M', 's'),
-    (0x1D601, 'M', 't'),
-    (0x1D602, 'M', 'u'),
-    (0x1D603, 'M', 'v'),
-    (0x1D604, 'M', 'w'),
-    (0x1D605, 'M', 'x'),
-    (0x1D606, 'M', 'y'),
-    (0x1D607, 'M', 'z'),
-    (0x1D608, 'M', 'a'),
-    (0x1D609, 'M', 'b'),
-    (0x1D60A, 'M', 'c'),
-    (0x1D60B, 'M', 'd'),
-    (0x1D60C, 'M', 'e'),
-    (0x1D60D, 'M', 'f'),
-    (0x1D60E, 'M', 'g'),
-    (0x1D60F, 'M', 'h'),
-    (0x1D610, 'M', 'i'),
-    (0x1D611, 'M', 'j'),
-    (0x1D612, 'M', 'k'),
-    (0x1D613, 'M', 'l'),
-    (0x1D614, 'M', 'm'),
-    (0x1D615, 'M', 'n'),
-    (0x1D616, 'M', 'o'),
-    (0x1D617, 'M', 'p'),
-    (0x1D618, 'M', 'q'),
-    (0x1D619, 'M', 'r'),
-    (0x1D61A, 'M', 's'),
-    (0x1D61B, 'M', 't'),
-    (0x1D61C, 'M', 'u'),
-    (0x1D61D, 'M', 'v'),
-    (0x1D61E, 'M', 'w'),
-    (0x1D61F, 'M', 'x'),
-    (0x1D620, 'M', 'y'),
-    (0x1D621, 'M', 'z'),
-    (0x1D622, 'M', 'a'),
-    (0x1D623, 'M', 'b'),
-    (0x1D624, 'M', 'c'),
-    (0x1D625, 'M', 'd'),
-    (0x1D626, 'M', 'e'),
-    (0x1D627, 'M', 'f'),
-    (0x1D628, 'M', 'g'),
-    (0x1D629, 'M', 'h'),
-    (0x1D62A, 'M', 'i'),
-    ]
-
-def _seg_66() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
-    return [
-    (0x1D62B, 'M', 'j'),
-    (0x1D62C, 'M', 'k'),
-    (0x1D62D, 'M', 'l'),
-    (0x1D62E, 'M', 'm'),
-    (0x1D62F, 'M', 'n'),
-    (0x1D630, 'M', 'o'),
-    (0x1D631, 'M', 'p'),
-    (0x1D632, 'M', 'q'),
-    (0x1D633, 'M', 'r'),
-    (0x1D634, 'M', 's'),
-    (0x1D635, 'M', 't'),
-    (0x1D636, 'M', 'u'),
-    (0x1D637, 'M', 'v'),
-    (0x1D638, 'M', 'w'),
-    (0x1D639, 'M', 'x'),
-    (0x1D63A, 'M', 'y'),
-    (0x1D63B, 'M', 'z'),
-    (0x1D63C, 'M', 'a'),
-    (0x1D63D, 'M', 'b'),
-    (0x1D63E, 'M', 'c'),
-    (0x1D63F, 'M', 'd'),
-    (0x1D640, 'M', 'e'),
-    (0x1D641, 'M', 'f'),
-    (0x1D642, 'M', 'g'),
-    (0x1D643, 'M', 'h'),
-    (0x1D644, 'M', 'i'),
-    (0x1D645, 'M', 'j'),
-    (0x1D646, 'M', 'k'),
-    (0x1D647, 'M', 'l'),
-    (0x1D648, 'M', 'm'),
-    (0x1D649, 'M', 'n'),
-    (0x1D64A, 'M', 'o'),
-    (0x1D64B, 'M', 'p'),
-    (0x1D64C, 'M', 'q'),
-    (0x1D64D, 'M', 'r'),
-    (0x1D64E, 'M', 's'),
-    (0x1D64F, 'M', 't'),
-    (0x1D650, 'M', 'u'),
-    (0x1D651, 'M', 'v'),
-    (0x1D652, 'M', 'w'),
-    (0x1D653, 'M', 'x'),
-    (0x1D654, 'M', 'y'),
-    (0x1D655, 'M', 'z'),
-    (0x1D656, 'M', 'a'),
-    (0x1D657, 'M', 'b'),
-    (0x1D658, 'M', 'c'),
-    (0x1D659, 'M', 'd'),
-    (0x1D65A, 'M', 'e'),
-    (0x1D65B, 'M', 'f'),
-    (0x1D65C, 'M', 'g'),
-    (0x1D65D, 'M', 'h'),
-    (0x1D65E, 'M', 'i'),
-    (0x1D65F, 'M', 'j'),
-    (0x1D660, 'M', 'k'),
-    (0x1D661, 'M', 'l'),
-    (0x1D662, 'M', 'm'),
-    (0x1D663, 'M', 'n'),
-    (0x1D664, 'M', 'o'),
-    (0x1D665, 'M', 'p'),
-    (0x1D666, 'M', 'q'),
-    (0x1D667, 'M', 'r'),
-    (0x1D668, 'M', 's'),
-    (0x1D669, 'M', 't'),
-    (0x1D66A, 'M', 'u'),
-    (0x1D66B, 'M', 'v'),
-    (0x1D66C, 'M', 'w'),
-    (0x1D66D, 'M', 'x'),
-    (0x1D66E, 'M', 'y'),
-    (0x1D66F, 'M', 'z'),
-    (0x1D670, 'M', 'a'),
-    (0x1D671, 'M', 'b'),
-    (0x1D672, 'M', 'c'),
-    (0x1D673, 'M', 'd'),
-    (0x1D674, 'M', 'e'),
-    (0x1D675, 'M', 'f'),
-    (0x1D676, 'M', 'g'),
-    (0x1D677, 'M', 'h'),
-    (0x1D678, 'M', 'i'),
-    (0x1D679, 'M', 'j'),
-    (0x1D67A, 'M', 'k'),
-    (0x1D67B, 'M', 'l'),
-    (0x1D67C, 'M', 'm'),
-    (0x1D67D, 'M', 'n'),
-    (0x1D67E, 'M', 'o'),
-    (0x1D67F, 'M', 'p'),
-    (0x1D680, 'M', 'q'),
-    (0x1D681, 'M', 'r'),
-    (0x1D682, 'M', 's'),
-    (0x1D683, 'M', 't'),
-    (0x1D684, 'M', 'u'),
-    (0x1D685, 'M', 'v'),
-    (0x1D686, 'M', 'w'),
-    (0x1D687, 'M', 'x'),
-    (0x1D688, 'M', 'y'),
-    (0x1D689, 'M', 'z'),
-    (0x1D68A, 'M', 'a'),
-    (0x1D68B, 'M', 'b'),
-    (0x1D68C, 'M', 'c'),
-    (0x1D68D, 'M', 'd'),
-    (0x1D68E, 'M', 'e'),
-    ]
-
-def _seg_67() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
-    return [
-    (0x1D68F, 'M', 'f'),
-    (0x1D690, 'M', 'g'),
-    (0x1D691, 'M', 'h'),
-    (0x1D692, 'M', 'i'),
-    (0x1D693, 'M', 'j'),
-    (0x1D694, 'M', 'k'),
-    (0x1D695, 'M', 'l'),
-    (0x1D696, 'M', 'm'),
-    (0x1D697, 'M', 'n'),
-    (0x1D698, 'M', 'o'),
-    (0x1D699, 'M', 'p'),
-    (0x1D69A, 'M', 'q'),
-    (0x1D69B, 'M', 'r'),
-    (0x1D69C, 'M', 's'),
-    (0x1D69D, 'M', 't'),
-    (0x1D69E, 'M', 'u'),
-    (0x1D69F, 'M', 'v'),
-    (0x1D6A0, 'M', 'w'),
-    (0x1D6A1, 'M', 'x'),
-    (0x1D6A2, 'M', 'y'),
-    (0x1D6A3, 'M', 'z'),
-    (0x1D6A4, 'M', 'ı'),
-    (0x1D6A5, 'M', 'È·'),
-    (0x1D6A6, 'X'),
-    (0x1D6A8, 'M', 'α'),
-    (0x1D6A9, 'M', 'β'),
-    (0x1D6AA, 'M', 'γ'),
-    (0x1D6AB, 'M', 'δ'),
-    (0x1D6AC, 'M', 'ε'),
-    (0x1D6AD, 'M', 'ζ'),
-    (0x1D6AE, 'M', 'η'),
-    (0x1D6AF, 'M', 'θ'),
-    (0x1D6B0, 'M', 'ι'),
-    (0x1D6B1, 'M', 'κ'),
-    (0x1D6B2, 'M', 'λ'),
-    (0x1D6B3, 'M', 'μ'),
-    (0x1D6B4, 'M', 'ν'),
-    (0x1D6B5, 'M', 'ξ'),
-    (0x1D6B6, 'M', 'ο'),
-    (0x1D6B7, 'M', 'Ï€'),
-    (0x1D6B8, 'M', 'Ï'),
-    (0x1D6B9, 'M', 'θ'),
-    (0x1D6BA, 'M', 'σ'),
-    (0x1D6BB, 'M', 'Ï„'),
-    (0x1D6BC, 'M', 'Ï…'),
-    (0x1D6BD, 'M', 'φ'),
-    (0x1D6BE, 'M', 'χ'),
-    (0x1D6BF, 'M', 'ψ'),
-    (0x1D6C0, 'M', 'ω'),
-    (0x1D6C1, 'M', '∇'),
-    (0x1D6C2, 'M', 'α'),
-    (0x1D6C3, 'M', 'β'),
-    (0x1D6C4, 'M', 'γ'),
-    (0x1D6C5, 'M', 'δ'),
-    (0x1D6C6, 'M', 'ε'),
-    (0x1D6C7, 'M', 'ζ'),
-    (0x1D6C8, 'M', 'η'),
-    (0x1D6C9, 'M', 'θ'),
-    (0x1D6CA, 'M', 'ι'),
-    (0x1D6CB, 'M', 'κ'),
-    (0x1D6CC, 'M', 'λ'),
-    (0x1D6CD, 'M', 'μ'),
-    (0x1D6CE, 'M', 'ν'),
-    (0x1D6CF, 'M', 'ξ'),
-    (0x1D6D0, 'M', 'ο'),
-    (0x1D6D1, 'M', 'Ï€'),
-    (0x1D6D2, 'M', 'Ï'),
-    (0x1D6D3, 'M', 'σ'),
-    (0x1D6D5, 'M', 'Ï„'),
-    (0x1D6D6, 'M', 'Ï…'),
-    (0x1D6D7, 'M', 'φ'),
-    (0x1D6D8, 'M', 'χ'),
-    (0x1D6D9, 'M', 'ψ'),
-    (0x1D6DA, 'M', 'ω'),
-    (0x1D6DB, 'M', '∂'),
-    (0x1D6DC, 'M', 'ε'),
-    (0x1D6DD, 'M', 'θ'),
-    (0x1D6DE, 'M', 'κ'),
-    (0x1D6DF, 'M', 'φ'),
-    (0x1D6E0, 'M', 'Ï'),
-    (0x1D6E1, 'M', 'Ï€'),
-    (0x1D6E2, 'M', 'α'),
-    (0x1D6E3, 'M', 'β'),
-    (0x1D6E4, 'M', 'γ'),
-    (0x1D6E5, 'M', 'δ'),
-    (0x1D6E6, 'M', 'ε'),
-    (0x1D6E7, 'M', 'ζ'),
-    (0x1D6E8, 'M', 'η'),
-    (0x1D6E9, 'M', 'θ'),
-    (0x1D6EA, 'M', 'ι'),
-    (0x1D6EB, 'M', 'κ'),
-    (0x1D6EC, 'M', 'λ'),
-    (0x1D6ED, 'M', 'μ'),
-    (0x1D6EE, 'M', 'ν'),
-    (0x1D6EF, 'M', 'ξ'),
-    (0x1D6F0, 'M', 'ο'),
-    (0x1D6F1, 'M', 'Ï€'),
-    (0x1D6F2, 'M', 'Ï'),
-    (0x1D6F3, 'M', 'θ'),
-    (0x1D6F4, 'M', 'σ'),
-    ]
-
-def _seg_68() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
-    return [
-    (0x1D6F5, 'M', 'Ï„'),
-    (0x1D6F6, 'M', 'Ï…'),
-    (0x1D6F7, 'M', 'φ'),
-    (0x1D6F8, 'M', 'χ'),
-    (0x1D6F9, 'M', 'ψ'),
-    (0x1D6FA, 'M', 'ω'),
-    (0x1D6FB, 'M', '∇'),
-    (0x1D6FC, 'M', 'α'),
-    (0x1D6FD, 'M', 'β'),
-    (0x1D6FE, 'M', 'γ'),
-    (0x1D6FF, 'M', 'δ'),
-    (0x1D700, 'M', 'ε'),
-    (0x1D701, 'M', 'ζ'),
-    (0x1D702, 'M', 'η'),
-    (0x1D703, 'M', 'θ'),
-    (0x1D704, 'M', 'ι'),
-    (0x1D705, 'M', 'κ'),
-    (0x1D706, 'M', 'λ'),
-    (0x1D707, 'M', 'μ'),
-    (0x1D708, 'M', 'ν'),
-    (0x1D709, 'M', 'ξ'),
-    (0x1D70A, 'M', 'ο'),
-    (0x1D70B, 'M', 'Ï€'),
-    (0x1D70C, 'M', 'Ï'),
-    (0x1D70D, 'M', 'σ'),
-    (0x1D70F, 'M', 'Ï„'),
-    (0x1D710, 'M', 'Ï…'),
-    (0x1D711, 'M', 'φ'),
-    (0x1D712, 'M', 'χ'),
-    (0x1D713, 'M', 'ψ'),
-    (0x1D714, 'M', 'ω'),
-    (0x1D715, 'M', '∂'),
-    (0x1D716, 'M', 'ε'),
-    (0x1D717, 'M', 'θ'),
-    (0x1D718, 'M', 'κ'),
-    (0x1D719, 'M', 'φ'),
-    (0x1D71A, 'M', 'Ï'),
-    (0x1D71B, 'M', 'Ï€'),
-    (0x1D71C, 'M', 'α'),
-    (0x1D71D, 'M', 'β'),
-    (0x1D71E, 'M', 'γ'),
-    (0x1D71F, 'M', 'δ'),
-    (0x1D720, 'M', 'ε'),
-    (0x1D721, 'M', 'ζ'),
-    (0x1D722, 'M', 'η'),
-    (0x1D723, 'M', 'θ'),
-    (0x1D724, 'M', 'ι'),
-    (0x1D725, 'M', 'κ'),
-    (0x1D726, 'M', 'λ'),
-    (0x1D727, 'M', 'μ'),
-    (0x1D728, 'M', 'ν'),
-    (0x1D729, 'M', 'ξ'),
-    (0x1D72A, 'M', 'ο'),
-    (0x1D72B, 'M', 'Ï€'),
-    (0x1D72C, 'M', 'Ï'),
-    (0x1D72D, 'M', 'θ'),
-    (0x1D72E, 'M', 'σ'),
-    (0x1D72F, 'M', 'Ï„'),
-    (0x1D730, 'M', 'Ï…'),
-    (0x1D731, 'M', 'φ'),
-    (0x1D732, 'M', 'χ'),
-    (0x1D733, 'M', 'ψ'),
-    (0x1D734, 'M', 'ω'),
-    (0x1D735, 'M', '∇'),
-    (0x1D736, 'M', 'α'),
-    (0x1D737, 'M', 'β'),
-    (0x1D738, 'M', 'γ'),
-    (0x1D739, 'M', 'δ'),
-    (0x1D73A, 'M', 'ε'),
-    (0x1D73B, 'M', 'ζ'),
-    (0x1D73C, 'M', 'η'),
-    (0x1D73D, 'M', 'θ'),
-    (0x1D73E, 'M', 'ι'),
-    (0x1D73F, 'M', 'κ'),
-    (0x1D740, 'M', 'λ'),
-    (0x1D741, 'M', 'μ'),
-    (0x1D742, 'M', 'ν'),
-    (0x1D743, 'M', 'ξ'),
-    (0x1D744, 'M', 'ο'),
-    (0x1D745, 'M', 'Ï€'),
-    (0x1D746, 'M', 'Ï'),
-    (0x1D747, 'M', 'σ'),
-    (0x1D749, 'M', 'Ï„'),
-    (0x1D74A, 'M', 'Ï…'),
-    (0x1D74B, 'M', 'φ'),
-    (0x1D74C, 'M', 'χ'),
-    (0x1D74D, 'M', 'ψ'),
-    (0x1D74E, 'M', 'ω'),
-    (0x1D74F, 'M', '∂'),
-    (0x1D750, 'M', 'ε'),
-    (0x1D751, 'M', 'θ'),
-    (0x1D752, 'M', 'κ'),
-    (0x1D753, 'M', 'φ'),
-    (0x1D754, 'M', 'Ï'),
-    (0x1D755, 'M', 'Ï€'),
-    (0x1D756, 'M', 'α'),
-    (0x1D757, 'M', 'β'),
-    (0x1D758, 'M', 'γ'),
-    (0x1D759, 'M', 'δ'),
-    (0x1D75A, 'M', 'ε'),
-    ]
-
-def _seg_69() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
-    return [
-    (0x1D75B, 'M', 'ζ'),
-    (0x1D75C, 'M', 'η'),
-    (0x1D75D, 'M', 'θ'),
-    (0x1D75E, 'M', 'ι'),
-    (0x1D75F, 'M', 'κ'),
-    (0x1D760, 'M', 'λ'),
-    (0x1D761, 'M', 'μ'),
-    (0x1D762, 'M', 'ν'),
-    (0x1D763, 'M', 'ξ'),
-    (0x1D764, 'M', 'ο'),
-    (0x1D765, 'M', 'Ï€'),
-    (0x1D766, 'M', 'Ï'),
-    (0x1D767, 'M', 'θ'),
-    (0x1D768, 'M', 'σ'),
-    (0x1D769, 'M', 'Ï„'),
-    (0x1D76A, 'M', 'Ï…'),
-    (0x1D76B, 'M', 'φ'),
-    (0x1D76C, 'M', 'χ'),
-    (0x1D76D, 'M', 'ψ'),
-    (0x1D76E, 'M', 'ω'),
-    (0x1D76F, 'M', '∇'),
-    (0x1D770, 'M', 'α'),
-    (0x1D771, 'M', 'β'),
-    (0x1D772, 'M', 'γ'),
-    (0x1D773, 'M', 'δ'),
-    (0x1D774, 'M', 'ε'),
-    (0x1D775, 'M', 'ζ'),
-    (0x1D776, 'M', 'η'),
-    (0x1D777, 'M', 'θ'),
-    (0x1D778, 'M', 'ι'),
-    (0x1D779, 'M', 'κ'),
-    (0x1D77A, 'M', 'λ'),
-    (0x1D77B, 'M', 'μ'),
-    (0x1D77C, 'M', 'ν'),
-    (0x1D77D, 'M', 'ξ'),
-    (0x1D77E, 'M', 'ο'),
-    (0x1D77F, 'M', 'Ï€'),
-    (0x1D780, 'M', 'Ï'),
-    (0x1D781, 'M', 'σ'),
-    (0x1D783, 'M', 'Ï„'),
-    (0x1D784, 'M', 'Ï…'),
-    (0x1D785, 'M', 'φ'),
-    (0x1D786, 'M', 'χ'),
-    (0x1D787, 'M', 'ψ'),
-    (0x1D788, 'M', 'ω'),
-    (0x1D789, 'M', '∂'),
-    (0x1D78A, 'M', 'ε'),
-    (0x1D78B, 'M', 'θ'),
-    (0x1D78C, 'M', 'κ'),
-    (0x1D78D, 'M', 'φ'),
-    (0x1D78E, 'M', 'Ï'),
-    (0x1D78F, 'M', 'Ï€'),
-    (0x1D790, 'M', 'α'),
-    (0x1D791, 'M', 'β'),
-    (0x1D792, 'M', 'γ'),
-    (0x1D793, 'M', 'δ'),
-    (0x1D794, 'M', 'ε'),
-    (0x1D795, 'M', 'ζ'),
-    (0x1D796, 'M', 'η'),
-    (0x1D797, 'M', 'θ'),
-    (0x1D798, 'M', 'ι'),
-    (0x1D799, 'M', 'κ'),
-    (0x1D79A, 'M', 'λ'),
-    (0x1D79B, 'M', 'μ'),
-    (0x1D79C, 'M', 'ν'),
-    (0x1D79D, 'M', 'ξ'),
-    (0x1D79E, 'M', 'ο'),
-    (0x1D79F, 'M', 'Ï€'),
-    (0x1D7A0, 'M', 'Ï'),
-    (0x1D7A1, 'M', 'θ'),
-    (0x1D7A2, 'M', 'σ'),
-    (0x1D7A3, 'M', 'Ï„'),
-    (0x1D7A4, 'M', 'Ï…'),
-    (0x1D7A5, 'M', 'φ'),
-    (0x1D7A6, 'M', 'χ'),
-    (0x1D7A7, 'M', 'ψ'),
-    (0x1D7A8, 'M', 'ω'),
-    (0x1D7A9, 'M', '∇'),
-    (0x1D7AA, 'M', 'α'),
-    (0x1D7AB, 'M', 'β'),
-    (0x1D7AC, 'M', 'γ'),
-    (0x1D7AD, 'M', 'δ'),
-    (0x1D7AE, 'M', 'ε'),
-    (0x1D7AF, 'M', 'ζ'),
-    (0x1D7B0, 'M', 'η'),
-    (0x1D7B1, 'M', 'θ'),
-    (0x1D7B2, 'M', 'ι'),
-    (0x1D7B3, 'M', 'κ'),
-    (0x1D7B4, 'M', 'λ'),
-    (0x1D7B5, 'M', 'μ'),
-    (0x1D7B6, 'M', 'ν'),
-    (0x1D7B7, 'M', 'ξ'),
-    (0x1D7B8, 'M', 'ο'),
-    (0x1D7B9, 'M', 'Ï€'),
-    (0x1D7BA, 'M', 'Ï'),
-    (0x1D7BB, 'M', 'σ'),
-    (0x1D7BD, 'M', 'Ï„'),
-    (0x1D7BE, 'M', 'Ï…'),
-    (0x1D7BF, 'M', 'φ'),
-    (0x1D7C0, 'M', 'χ'),
-    ]
-
-def _seg_70() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
-    return [
-    (0x1D7C1, 'M', 'ψ'),
-    (0x1D7C2, 'M', 'ω'),
-    (0x1D7C3, 'M', '∂'),
-    (0x1D7C4, 'M', 'ε'),
-    (0x1D7C5, 'M', 'θ'),
-    (0x1D7C6, 'M', 'κ'),
-    (0x1D7C7, 'M', 'φ'),
-    (0x1D7C8, 'M', 'Ï'),
-    (0x1D7C9, 'M', 'Ï€'),
-    (0x1D7CA, 'M', 'Ï'),
-    (0x1D7CC, 'X'),
-    (0x1D7CE, 'M', '0'),
-    (0x1D7CF, 'M', '1'),
-    (0x1D7D0, 'M', '2'),
-    (0x1D7D1, 'M', '3'),
-    (0x1D7D2, 'M', '4'),
-    (0x1D7D3, 'M', '5'),
-    (0x1D7D4, 'M', '6'),
-    (0x1D7D5, 'M', '7'),
-    (0x1D7D6, 'M', '8'),
-    (0x1D7D7, 'M', '9'),
-    (0x1D7D8, 'M', '0'),
-    (0x1D7D9, 'M', '1'),
-    (0x1D7DA, 'M', '2'),
-    (0x1D7DB, 'M', '3'),
-    (0x1D7DC, 'M', '4'),
-    (0x1D7DD, 'M', '5'),
-    (0x1D7DE, 'M', '6'),
-    (0x1D7DF, 'M', '7'),
-    (0x1D7E0, 'M', '8'),
-    (0x1D7E1, 'M', '9'),
-    (0x1D7E2, 'M', '0'),
-    (0x1D7E3, 'M', '1'),
-    (0x1D7E4, 'M', '2'),
-    (0x1D7E5, 'M', '3'),
-    (0x1D7E6, 'M', '4'),
-    (0x1D7E7, 'M', '5'),
-    (0x1D7E8, 'M', '6'),
-    (0x1D7E9, 'M', '7'),
-    (0x1D7EA, 'M', '8'),
-    (0x1D7EB, 'M', '9'),
-    (0x1D7EC, 'M', '0'),
-    (0x1D7ED, 'M', '1'),
-    (0x1D7EE, 'M', '2'),
-    (0x1D7EF, 'M', '3'),
-    (0x1D7F0, 'M', '4'),
-    (0x1D7F1, 'M', '5'),
-    (0x1D7F2, 'M', '6'),
-    (0x1D7F3, 'M', '7'),
-    (0x1D7F4, 'M', '8'),
-    (0x1D7F5, 'M', '9'),
-    (0x1D7F6, 'M', '0'),
-    (0x1D7F7, 'M', '1'),
-    (0x1D7F8, 'M', '2'),
-    (0x1D7F9, 'M', '3'),
-    (0x1D7FA, 'M', '4'),
-    (0x1D7FB, 'M', '5'),
-    (0x1D7FC, 'M', '6'),
-    (0x1D7FD, 'M', '7'),
-    (0x1D7FE, 'M', '8'),
-    (0x1D7FF, 'M', '9'),
-    (0x1D800, 'V'),
-    (0x1DA8C, 'X'),
-    (0x1DA9B, 'V'),
-    (0x1DAA0, 'X'),
-    (0x1DAA1, 'V'),
-    (0x1DAB0, 'X'),
-    (0x1DF00, 'V'),
-    (0x1DF1F, 'X'),
-    (0x1E000, 'V'),
-    (0x1E007, 'X'),
-    (0x1E008, 'V'),
-    (0x1E019, 'X'),
-    (0x1E01B, 'V'),
-    (0x1E022, 'X'),
-    (0x1E023, 'V'),
-    (0x1E025, 'X'),
-    (0x1E026, 'V'),
-    (0x1E02B, 'X'),
-    (0x1E100, 'V'),
-    (0x1E12D, 'X'),
-    (0x1E130, 'V'),
-    (0x1E13E, 'X'),
-    (0x1E140, 'V'),
-    (0x1E14A, 'X'),
-    (0x1E14E, 'V'),
-    (0x1E150, 'X'),
-    (0x1E290, 'V'),
-    (0x1E2AF, 'X'),
-    (0x1E2C0, 'V'),
-    (0x1E2FA, 'X'),
-    (0x1E2FF, 'V'),
-    (0x1E300, 'X'),
-    (0x1E7E0, 'V'),
-    (0x1E7E7, 'X'),
-    (0x1E7E8, 'V'),
-    (0x1E7EC, 'X'),
-    (0x1E7ED, 'V'),
-    (0x1E7EF, 'X'),
-    (0x1E7F0, 'V'),
-    ]
-
-def _seg_71() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
-    return [
-    (0x1E7FF, 'X'),
-    (0x1E800, 'V'),
-    (0x1E8C5, 'X'),
-    (0x1E8C7, 'V'),
-    (0x1E8D7, 'X'),
-    (0x1E900, 'M', '𞤢'),
-    (0x1E901, 'M', '𞤣'),
-    (0x1E902, 'M', '𞤤'),
-    (0x1E903, 'M', '𞤥'),
-    (0x1E904, 'M', '𞤦'),
-    (0x1E905, 'M', '𞤧'),
-    (0x1E906, 'M', '𞤨'),
-    (0x1E907, 'M', '𞤩'),
-    (0x1E908, 'M', '𞤪'),
-    (0x1E909, 'M', '𞤫'),
-    (0x1E90A, 'M', '𞤬'),
-    (0x1E90B, 'M', '𞤭'),
-    (0x1E90C, 'M', '𞤮'),
-    (0x1E90D, 'M', '𞤯'),
-    (0x1E90E, 'M', '𞤰'),
-    (0x1E90F, 'M', '𞤱'),
-    (0x1E910, 'M', '𞤲'),
-    (0x1E911, 'M', '𞤳'),
-    (0x1E912, 'M', '𞤴'),
-    (0x1E913, 'M', '𞤵'),
-    (0x1E914, 'M', '𞤶'),
-    (0x1E915, 'M', '𞤷'),
-    (0x1E916, 'M', '𞤸'),
-    (0x1E917, 'M', '𞤹'),
-    (0x1E918, 'M', '𞤺'),
-    (0x1E919, 'M', '𞤻'),
-    (0x1E91A, 'M', '𞤼'),
-    (0x1E91B, 'M', '𞤽'),
-    (0x1E91C, 'M', '𞤾'),
-    (0x1E91D, 'M', '𞤿'),
-    (0x1E91E, 'M', '𞥀'),
-    (0x1E91F, 'M', 'ðž¥'),
-    (0x1E920, 'M', '𞥂'),
-    (0x1E921, 'M', '𞥃'),
-    (0x1E922, 'V'),
-    (0x1E94C, 'X'),
-    (0x1E950, 'V'),
-    (0x1E95A, 'X'),
-    (0x1E95E, 'V'),
-    (0x1E960, 'X'),
-    (0x1EC71, 'V'),
-    (0x1ECB5, 'X'),
-    (0x1ED01, 'V'),
-    (0x1ED3E, 'X'),
-    (0x1EE00, 'M', 'ا'),
-    (0x1EE01, 'M', 'ب'),
-    (0x1EE02, 'M', 'ج'),
-    (0x1EE03, 'M', 'د'),
-    (0x1EE04, 'X'),
-    (0x1EE05, 'M', 'Ùˆ'),
-    (0x1EE06, 'M', 'ز'),
-    (0x1EE07, 'M', 'Ø­'),
-    (0x1EE08, 'M', 'Ø·'),
-    (0x1EE09, 'M', 'ÙŠ'),
-    (0x1EE0A, 'M', 'Ùƒ'),
-    (0x1EE0B, 'M', 'Ù„'),
-    (0x1EE0C, 'M', 'Ù…'),
-    (0x1EE0D, 'M', 'Ù†'),
-    (0x1EE0E, 'M', 'س'),
-    (0x1EE0F, 'M', 'ع'),
-    (0x1EE10, 'M', 'Ù'),
-    (0x1EE11, 'M', 'ص'),
-    (0x1EE12, 'M', 'Ù‚'),
-    (0x1EE13, 'M', 'ر'),
-    (0x1EE14, 'M', 'Ø´'),
-    (0x1EE15, 'M', 'ت'),
-    (0x1EE16, 'M', 'Ø«'),
-    (0x1EE17, 'M', 'Ø®'),
-    (0x1EE18, 'M', 'ذ'),
-    (0x1EE19, 'M', 'ض'),
-    (0x1EE1A, 'M', 'ظ'),
-    (0x1EE1B, 'M', 'غ'),
-    (0x1EE1C, 'M', 'Ù®'),
-    (0x1EE1D, 'M', 'Úº'),
-    (0x1EE1E, 'M', 'Ú¡'),
-    (0x1EE1F, 'M', 'Ù¯'),
-    (0x1EE20, 'X'),
-    (0x1EE21, 'M', 'ب'),
-    (0x1EE22, 'M', 'ج'),
-    (0x1EE23, 'X'),
-    (0x1EE24, 'M', 'Ù‡'),
-    (0x1EE25, 'X'),
-    (0x1EE27, 'M', 'Ø­'),
-    (0x1EE28, 'X'),
-    (0x1EE29, 'M', 'ÙŠ'),
-    (0x1EE2A, 'M', 'Ùƒ'),
-    (0x1EE2B, 'M', 'Ù„'),
-    (0x1EE2C, 'M', 'Ù…'),
-    (0x1EE2D, 'M', 'Ù†'),
-    (0x1EE2E, 'M', 'س'),
-    (0x1EE2F, 'M', 'ع'),
-    (0x1EE30, 'M', 'Ù'),
-    (0x1EE31, 'M', 'ص'),
-    (0x1EE32, 'M', 'Ù‚'),
-    (0x1EE33, 'X'),
-    ]
-
-def _seg_72() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
-    return [
-    (0x1EE34, 'M', 'Ø´'),
-    (0x1EE35, 'M', 'ت'),
-    (0x1EE36, 'M', 'Ø«'),
-    (0x1EE37, 'M', 'Ø®'),
-    (0x1EE38, 'X'),
-    (0x1EE39, 'M', 'ض'),
-    (0x1EE3A, 'X'),
-    (0x1EE3B, 'M', 'غ'),
-    (0x1EE3C, 'X'),
-    (0x1EE42, 'M', 'ج'),
-    (0x1EE43, 'X'),
-    (0x1EE47, 'M', 'Ø­'),
-    (0x1EE48, 'X'),
-    (0x1EE49, 'M', 'ÙŠ'),
-    (0x1EE4A, 'X'),
-    (0x1EE4B, 'M', 'Ù„'),
-    (0x1EE4C, 'X'),
-    (0x1EE4D, 'M', 'Ù†'),
-    (0x1EE4E, 'M', 'س'),
-    (0x1EE4F, 'M', 'ع'),
-    (0x1EE50, 'X'),
-    (0x1EE51, 'M', 'ص'),
-    (0x1EE52, 'M', 'Ù‚'),
-    (0x1EE53, 'X'),
-    (0x1EE54, 'M', 'Ø´'),
-    (0x1EE55, 'X'),
-    (0x1EE57, 'M', 'Ø®'),
-    (0x1EE58, 'X'),
-    (0x1EE59, 'M', 'ض'),
-    (0x1EE5A, 'X'),
-    (0x1EE5B, 'M', 'غ'),
-    (0x1EE5C, 'X'),
-    (0x1EE5D, 'M', 'Úº'),
-    (0x1EE5E, 'X'),
-    (0x1EE5F, 'M', 'Ù¯'),
-    (0x1EE60, 'X'),
-    (0x1EE61, 'M', 'ب'),
-    (0x1EE62, 'M', 'ج'),
-    (0x1EE63, 'X'),
-    (0x1EE64, 'M', 'Ù‡'),
-    (0x1EE65, 'X'),
-    (0x1EE67, 'M', 'Ø­'),
-    (0x1EE68, 'M', 'Ø·'),
-    (0x1EE69, 'M', 'ÙŠ'),
-    (0x1EE6A, 'M', 'Ùƒ'),
-    (0x1EE6B, 'X'),
-    (0x1EE6C, 'M', 'Ù…'),
-    (0x1EE6D, 'M', 'Ù†'),
-    (0x1EE6E, 'M', 'س'),
-    (0x1EE6F, 'M', 'ع'),
-    (0x1EE70, 'M', 'Ù'),
-    (0x1EE71, 'M', 'ص'),
-    (0x1EE72, 'M', 'Ù‚'),
-    (0x1EE73, 'X'),
-    (0x1EE74, 'M', 'Ø´'),
-    (0x1EE75, 'M', 'ت'),
-    (0x1EE76, 'M', 'Ø«'),
-    (0x1EE77, 'M', 'Ø®'),
-    (0x1EE78, 'X'),
-    (0x1EE79, 'M', 'ض'),
-    (0x1EE7A, 'M', 'ظ'),
-    (0x1EE7B, 'M', 'غ'),
-    (0x1EE7C, 'M', 'Ù®'),
-    (0x1EE7D, 'X'),
-    (0x1EE7E, 'M', 'Ú¡'),
-    (0x1EE7F, 'X'),
-    (0x1EE80, 'M', 'ا'),
-    (0x1EE81, 'M', 'ب'),
-    (0x1EE82, 'M', 'ج'),
-    (0x1EE83, 'M', 'د'),
-    (0x1EE84, 'M', 'Ù‡'),
-    (0x1EE85, 'M', 'Ùˆ'),
-    (0x1EE86, 'M', 'ز'),
-    (0x1EE87, 'M', 'Ø­'),
-    (0x1EE88, 'M', 'Ø·'),
-    (0x1EE89, 'M', 'ÙŠ'),
-    (0x1EE8A, 'X'),
-    (0x1EE8B, 'M', 'Ù„'),
-    (0x1EE8C, 'M', 'Ù…'),
-    (0x1EE8D, 'M', 'Ù†'),
-    (0x1EE8E, 'M', 'س'),
-    (0x1EE8F, 'M', 'ع'),
-    (0x1EE90, 'M', 'Ù'),
-    (0x1EE91, 'M', 'ص'),
-    (0x1EE92, 'M', 'Ù‚'),
-    (0x1EE93, 'M', 'ر'),
-    (0x1EE94, 'M', 'Ø´'),
-    (0x1EE95, 'M', 'ت'),
-    (0x1EE96, 'M', 'Ø«'),
-    (0x1EE97, 'M', 'Ø®'),
-    (0x1EE98, 'M', 'ذ'),
-    (0x1EE99, 'M', 'ض'),
-    (0x1EE9A, 'M', 'ظ'),
-    (0x1EE9B, 'M', 'غ'),
-    (0x1EE9C, 'X'),
-    (0x1EEA1, 'M', 'ب'),
-    (0x1EEA2, 'M', 'ج'),
-    (0x1EEA3, 'M', 'د'),
-    (0x1EEA4, 'X'),
-    (0x1EEA5, 'M', 'Ùˆ'),
-    ]
-
-def _seg_73() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
-    return [
-    (0x1EEA6, 'M', 'ز'),
-    (0x1EEA7, 'M', 'Ø­'),
-    (0x1EEA8, 'M', 'Ø·'),
-    (0x1EEA9, 'M', 'ÙŠ'),
-    (0x1EEAA, 'X'),
-    (0x1EEAB, 'M', 'Ù„'),
-    (0x1EEAC, 'M', 'Ù…'),
-    (0x1EEAD, 'M', 'Ù†'),
-    (0x1EEAE, 'M', 'س'),
-    (0x1EEAF, 'M', 'ع'),
-    (0x1EEB0, 'M', 'Ù'),
-    (0x1EEB1, 'M', 'ص'),
-    (0x1EEB2, 'M', 'Ù‚'),
-    (0x1EEB3, 'M', 'ر'),
-    (0x1EEB4, 'M', 'Ø´'),
-    (0x1EEB5, 'M', 'ت'),
-    (0x1EEB6, 'M', 'Ø«'),
-    (0x1EEB7, 'M', 'Ø®'),
-    (0x1EEB8, 'M', 'ذ'),
-    (0x1EEB9, 'M', 'ض'),
-    (0x1EEBA, 'M', 'ظ'),
-    (0x1EEBB, 'M', 'غ'),
-    (0x1EEBC, 'X'),
-    (0x1EEF0, 'V'),
-    (0x1EEF2, 'X'),
-    (0x1F000, 'V'),
-    (0x1F02C, 'X'),
-    (0x1F030, 'V'),
-    (0x1F094, 'X'),
-    (0x1F0A0, 'V'),
-    (0x1F0AF, 'X'),
-    (0x1F0B1, 'V'),
-    (0x1F0C0, 'X'),
-    (0x1F0C1, 'V'),
-    (0x1F0D0, 'X'),
-    (0x1F0D1, 'V'),
-    (0x1F0F6, 'X'),
-    (0x1F101, '3', '0,'),
-    (0x1F102, '3', '1,'),
-    (0x1F103, '3', '2,'),
-    (0x1F104, '3', '3,'),
-    (0x1F105, '3', '4,'),
-    (0x1F106, '3', '5,'),
-    (0x1F107, '3', '6,'),
-    (0x1F108, '3', '7,'),
-    (0x1F109, '3', '8,'),
-    (0x1F10A, '3', '9,'),
-    (0x1F10B, 'V'),
-    (0x1F110, '3', '(a)'),
-    (0x1F111, '3', '(b)'),
-    (0x1F112, '3', '(c)'),
-    (0x1F113, '3', '(d)'),
-    (0x1F114, '3', '(e)'),
-    (0x1F115, '3', '(f)'),
-    (0x1F116, '3', '(g)'),
-    (0x1F117, '3', '(h)'),
-    (0x1F118, '3', '(i)'),
-    (0x1F119, '3', '(j)'),
-    (0x1F11A, '3', '(k)'),
-    (0x1F11B, '3', '(l)'),
-    (0x1F11C, '3', '(m)'),
-    (0x1F11D, '3', '(n)'),
-    (0x1F11E, '3', '(o)'),
-    (0x1F11F, '3', '(p)'),
-    (0x1F120, '3', '(q)'),
-    (0x1F121, '3', '(r)'),
-    (0x1F122, '3', '(s)'),
-    (0x1F123, '3', '(t)'),
-    (0x1F124, '3', '(u)'),
-    (0x1F125, '3', '(v)'),
-    (0x1F126, '3', '(w)'),
-    (0x1F127, '3', '(x)'),
-    (0x1F128, '3', '(y)'),
-    (0x1F129, '3', '(z)'),
-    (0x1F12A, 'M', '〔s〕'),
-    (0x1F12B, 'M', 'c'),
-    (0x1F12C, 'M', 'r'),
-    (0x1F12D, 'M', 'cd'),
-    (0x1F12E, 'M', 'wz'),
-    (0x1F12F, 'V'),
-    (0x1F130, 'M', 'a'),
-    (0x1F131, 'M', 'b'),
-    (0x1F132, 'M', 'c'),
-    (0x1F133, 'M', 'd'),
-    (0x1F134, 'M', 'e'),
-    (0x1F135, 'M', 'f'),
-    (0x1F136, 'M', 'g'),
-    (0x1F137, 'M', 'h'),
-    (0x1F138, 'M', 'i'),
-    (0x1F139, 'M', 'j'),
-    (0x1F13A, 'M', 'k'),
-    (0x1F13B, 'M', 'l'),
-    (0x1F13C, 'M', 'm'),
-    (0x1F13D, 'M', 'n'),
-    (0x1F13E, 'M', 'o'),
-    (0x1F13F, 'M', 'p'),
-    (0x1F140, 'M', 'q'),
-    (0x1F141, 'M', 'r'),
-    (0x1F142, 'M', 's'),
-    (0x1F143, 'M', 't'),
-    ]
-
-def _seg_74() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
-    return [
-    (0x1F144, 'M', 'u'),
-    (0x1F145, 'M', 'v'),
-    (0x1F146, 'M', 'w'),
-    (0x1F147, 'M', 'x'),
-    (0x1F148, 'M', 'y'),
-    (0x1F149, 'M', 'z'),
-    (0x1F14A, 'M', 'hv'),
-    (0x1F14B, 'M', 'mv'),
-    (0x1F14C, 'M', 'sd'),
-    (0x1F14D, 'M', 'ss'),
-    (0x1F14E, 'M', 'ppv'),
-    (0x1F14F, 'M', 'wc'),
-    (0x1F150, 'V'),
-    (0x1F16A, 'M', 'mc'),
-    (0x1F16B, 'M', 'md'),
-    (0x1F16C, 'M', 'mr'),
-    (0x1F16D, 'V'),
-    (0x1F190, 'M', 'dj'),
-    (0x1F191, 'V'),
-    (0x1F1AE, 'X'),
-    (0x1F1E6, 'V'),
-    (0x1F200, 'M', 'ã»ã‹'),
-    (0x1F201, 'M', 'ココ'),
-    (0x1F202, 'M', 'サ'),
-    (0x1F203, 'X'),
-    (0x1F210, 'M', '手'),
-    (0x1F211, 'M', 'å­—'),
-    (0x1F212, 'M', 'åŒ'),
-    (0x1F213, 'M', 'デ'),
-    (0x1F214, 'M', '二'),
-    (0x1F215, 'M', '多'),
-    (0x1F216, 'M', 'è§£'),
-    (0x1F217, 'M', '天'),
-    (0x1F218, 'M', '交'),
-    (0x1F219, 'M', '映'),
-    (0x1F21A, 'M', 'ç„¡'),
-    (0x1F21B, 'M', 'æ–™'),
-    (0x1F21C, 'M', 'å‰'),
-    (0x1F21D, 'M', '後'),
-    (0x1F21E, 'M', 'å†'),
-    (0x1F21F, 'M', 'æ–°'),
-    (0x1F220, 'M', 'åˆ'),
-    (0x1F221, 'M', '終'),
-    (0x1F222, 'M', '生'),
-    (0x1F223, 'M', '販'),
-    (0x1F224, 'M', '声'),
-    (0x1F225, 'M', 'å¹'),
-    (0x1F226, 'M', 'æ¼”'),
-    (0x1F227, 'M', '投'),
-    (0x1F228, 'M', 'æ•'),
-    (0x1F229, 'M', '一'),
-    (0x1F22A, 'M', '三'),
-    (0x1F22B, 'M', 'éŠ'),
-    (0x1F22C, 'M', 'å·¦'),
-    (0x1F22D, 'M', '中'),
-    (0x1F22E, 'M', 'å³'),
-    (0x1F22F, 'M', '指'),
-    (0x1F230, 'M', 'èµ°'),
-    (0x1F231, 'M', '打'),
-    (0x1F232, 'M', 'ç¦'),
-    (0x1F233, 'M', '空'),
-    (0x1F234, 'M', 'åˆ'),
-    (0x1F235, 'M', '満'),
-    (0x1F236, 'M', '有'),
-    (0x1F237, 'M', '月'),
-    (0x1F238, 'M', '申'),
-    (0x1F239, 'M', '割'),
-    (0x1F23A, 'M', 'å–¶'),
-    (0x1F23B, 'M', 'é…'),
-    (0x1F23C, 'X'),
-    (0x1F240, 'M', '〔本〕'),
-    (0x1F241, 'M', '〔三〕'),
-    (0x1F242, 'M', '〔二〕'),
-    (0x1F243, 'M', '〔安〕'),
-    (0x1F244, 'M', '〔点〕'),
-    (0x1F245, 'M', '〔打〕'),
-    (0x1F246, 'M', '〔盗〕'),
-    (0x1F247, 'M', '〔å‹ã€•'),
-    (0x1F248, 'M', '〔敗〕'),
-    (0x1F249, 'X'),
-    (0x1F250, 'M', 'å¾—'),
-    (0x1F251, 'M', 'å¯'),
-    (0x1F252, 'X'),
-    (0x1F260, 'V'),
-    (0x1F266, 'X'),
-    (0x1F300, 'V'),
-    (0x1F6D8, 'X'),
-    (0x1F6DD, 'V'),
-    (0x1F6ED, 'X'),
-    (0x1F6F0, 'V'),
-    (0x1F6FD, 'X'),
-    (0x1F700, 'V'),
-    (0x1F774, 'X'),
-    (0x1F780, 'V'),
-    (0x1F7D9, 'X'),
-    (0x1F7E0, 'V'),
-    (0x1F7EC, 'X'),
-    (0x1F7F0, 'V'),
-    (0x1F7F1, 'X'),
-    (0x1F800, 'V'),
-    ]
-
-def _seg_75() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
-    return [
-    (0x1F80C, 'X'),
-    (0x1F810, 'V'),
-    (0x1F848, 'X'),
-    (0x1F850, 'V'),
-    (0x1F85A, 'X'),
-    (0x1F860, 'V'),
-    (0x1F888, 'X'),
-    (0x1F890, 'V'),
-    (0x1F8AE, 'X'),
-    (0x1F8B0, 'V'),
-    (0x1F8B2, 'X'),
-    (0x1F900, 'V'),
-    (0x1FA54, 'X'),
-    (0x1FA60, 'V'),
-    (0x1FA6E, 'X'),
-    (0x1FA70, 'V'),
-    (0x1FA75, 'X'),
-    (0x1FA78, 'V'),
-    (0x1FA7D, 'X'),
-    (0x1FA80, 'V'),
-    (0x1FA87, 'X'),
-    (0x1FA90, 'V'),
-    (0x1FAAD, 'X'),
-    (0x1FAB0, 'V'),
-    (0x1FABB, 'X'),
-    (0x1FAC0, 'V'),
-    (0x1FAC6, 'X'),
-    (0x1FAD0, 'V'),
-    (0x1FADA, 'X'),
-    (0x1FAE0, 'V'),
-    (0x1FAE8, 'X'),
-    (0x1FAF0, 'V'),
-    (0x1FAF7, 'X'),
-    (0x1FB00, 'V'),
-    (0x1FB93, 'X'),
-    (0x1FB94, 'V'),
-    (0x1FBCB, 'X'),
-    (0x1FBF0, 'M', '0'),
-    (0x1FBF1, 'M', '1'),
-    (0x1FBF2, 'M', '2'),
-    (0x1FBF3, 'M', '3'),
-    (0x1FBF4, 'M', '4'),
-    (0x1FBF5, 'M', '5'),
-    (0x1FBF6, 'M', '6'),
-    (0x1FBF7, 'M', '7'),
-    (0x1FBF8, 'M', '8'),
-    (0x1FBF9, 'M', '9'),
-    (0x1FBFA, 'X'),
-    (0x20000, 'V'),
-    (0x2A6E0, 'X'),
-    (0x2A700, 'V'),
-    (0x2B739, 'X'),
-    (0x2B740, 'V'),
-    (0x2B81E, 'X'),
-    (0x2B820, 'V'),
-    (0x2CEA2, 'X'),
-    (0x2CEB0, 'V'),
-    (0x2EBE1, 'X'),
-    (0x2F800, 'M', '丽'),
-    (0x2F801, 'M', '丸'),
-    (0x2F802, 'M', 'ä¹'),
-    (0x2F803, 'M', 'ð „¢'),
-    (0x2F804, 'M', 'ä½ '),
-    (0x2F805, 'M', 'ä¾®'),
-    (0x2F806, 'M', 'ä¾»'),
-    (0x2F807, 'M', '倂'),
-    (0x2F808, 'M', 'åº'),
-    (0x2F809, 'M', 'å‚™'),
-    (0x2F80A, 'M', '僧'),
-    (0x2F80B, 'M', 'åƒ'),
-    (0x2F80C, 'M', 'ã’ž'),
-    (0x2F80D, 'M', '𠘺'),
-    (0x2F80E, 'M', 'å…'),
-    (0x2F80F, 'M', 'å…”'),
-    (0x2F810, 'M', 'å…¤'),
-    (0x2F811, 'M', 'å…·'),
-    (0x2F812, 'M', '𠔜'),
-    (0x2F813, 'M', 'ã’¹'),
-    (0x2F814, 'M', 'å…§'),
-    (0x2F815, 'M', 'å†'),
-    (0x2F816, 'M', 'ð •‹'),
-    (0x2F817, 'M', '冗'),
-    (0x2F818, 'M', '冤'),
-    (0x2F819, 'M', '仌'),
-    (0x2F81A, 'M', '冬'),
-    (0x2F81B, 'M', '况'),
-    (0x2F81C, 'M', '𩇟'),
-    (0x2F81D, 'M', '凵'),
-    (0x2F81E, 'M', '刃'),
-    (0x2F81F, 'M', '㓟'),
-    (0x2F820, 'M', '刻'),
-    (0x2F821, 'M', '剆'),
-    (0x2F822, 'M', '割'),
-    (0x2F823, 'M', '剷'),
-    (0x2F824, 'M', '㔕'),
-    (0x2F825, 'M', '勇'),
-    (0x2F826, 'M', '勉'),
-    (0x2F827, 'M', '勤'),
-    (0x2F828, 'M', '勺'),
-    (0x2F829, 'M', '包'),
-    ]
-
-def _seg_76() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
-    return [
-    (0x2F82A, 'M', '匆'),
-    (0x2F82B, 'M', '北'),
-    (0x2F82C, 'M', 'å‰'),
-    (0x2F82D, 'M', 'å‘'),
-    (0x2F82E, 'M', 'åš'),
-    (0x2F82F, 'M', 'å³'),
-    (0x2F830, 'M', 'å½'),
-    (0x2F831, 'M', 'å¿'),
-    (0x2F834, 'M', '𠨬'),
-    (0x2F835, 'M', 'ç°'),
-    (0x2F836, 'M', 'åŠ'),
-    (0x2F837, 'M', 'åŸ'),
-    (0x2F838, 'M', 'ð ­£'),
-    (0x2F839, 'M', 'å«'),
-    (0x2F83A, 'M', 'å±'),
-    (0x2F83B, 'M', 'å†'),
-    (0x2F83C, 'M', 'å’ž'),
-    (0x2F83D, 'M', 'å¸'),
-    (0x2F83E, 'M', '呈'),
-    (0x2F83F, 'M', '周'),
-    (0x2F840, 'M', 'å’¢'),
-    (0x2F841, 'M', 'å“¶'),
-    (0x2F842, 'M', 'å”'),
-    (0x2F843, 'M', 'å•“'),
-    (0x2F844, 'M', 'å•£'),
-    (0x2F845, 'M', 'å–„'),
-    (0x2F847, 'M', 'å–™'),
-    (0x2F848, 'M', 'å–«'),
-    (0x2F849, 'M', 'å–³'),
-    (0x2F84A, 'M', 'å—‚'),
-    (0x2F84B, 'M', '圖'),
-    (0x2F84C, 'M', '嘆'),
-    (0x2F84D, 'M', '圗'),
-    (0x2F84E, 'M', '噑'),
-    (0x2F84F, 'M', 'å™´'),
-    (0x2F850, 'M', '切'),
-    (0x2F851, 'M', '壮'),
-    (0x2F852, 'M', '城'),
-    (0x2F853, 'M', '埴'),
-    (0x2F854, 'M', 'å '),
-    (0x2F855, 'M', 'åž‹'),
-    (0x2F856, 'M', 'å ²'),
-    (0x2F857, 'M', 'å ±'),
-    (0x2F858, 'M', '墬'),
-    (0x2F859, 'M', '𡓤'),
-    (0x2F85A, 'M', '売'),
-    (0x2F85B, 'M', '壷'),
-    (0x2F85C, 'M', '夆'),
-    (0x2F85D, 'M', '多'),
-    (0x2F85E, 'M', '夢'),
-    (0x2F85F, 'M', '奢'),
-    (0x2F860, 'M', '𡚨'),
-    (0x2F861, 'M', '𡛪'),
-    (0x2F862, 'M', '姬'),
-    (0x2F863, 'M', '娛'),
-    (0x2F864, 'M', '娧'),
-    (0x2F865, 'M', '姘'),
-    (0x2F866, 'M', '婦'),
-    (0x2F867, 'M', 'ã›®'),
-    (0x2F868, 'X'),
-    (0x2F869, 'M', '嬈'),
-    (0x2F86A, 'M', '嬾'),
-    (0x2F86C, 'M', '𡧈'),
-    (0x2F86D, 'M', '寃'),
-    (0x2F86E, 'M', '寘'),
-    (0x2F86F, 'M', '寧'),
-    (0x2F870, 'M', '寳'),
-    (0x2F871, 'M', '𡬘'),
-    (0x2F872, 'M', '寿'),
-    (0x2F873, 'M', 'å°†'),
-    (0x2F874, 'X'),
-    (0x2F875, 'M', 'å°¢'),
-    (0x2F876, 'M', 'ãž'),
-    (0x2F877, 'M', 'å± '),
-    (0x2F878, 'M', 'å±®'),
-    (0x2F879, 'M', 'å³€'),
-    (0x2F87A, 'M', 'å²'),
-    (0x2F87B, 'M', 'ð¡·¤'),
-    (0x2F87C, 'M', '嵃'),
-    (0x2F87D, 'M', 'ð¡·¦'),
-    (0x2F87E, 'M', 'åµ®'),
-    (0x2F87F, 'M', '嵫'),
-    (0x2F880, 'M', 'åµ¼'),
-    (0x2F881, 'M', 'å·¡'),
-    (0x2F882, 'M', 'å·¢'),
-    (0x2F883, 'M', 'ã ¯'),
-    (0x2F884, 'M', 'å·½'),
-    (0x2F885, 'M', '帨'),
-    (0x2F886, 'M', '帽'),
-    (0x2F887, 'M', '幩'),
-    (0x2F888, 'M', 'ã¡¢'),
-    (0x2F889, 'M', '𢆃'),
-    (0x2F88A, 'M', '㡼'),
-    (0x2F88B, 'M', '庰'),
-    (0x2F88C, 'M', '庳'),
-    (0x2F88D, 'M', '庶'),
-    (0x2F88E, 'M', '廊'),
-    (0x2F88F, 'M', '𪎒'),
-    (0x2F890, 'M', '廾'),
-    (0x2F891, 'M', '𢌱'),
-    ]
-
-def _seg_77() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
-    return [
-    (0x2F893, 'M', 'èˆ'),
-    (0x2F894, 'M', 'å¼¢'),
-    (0x2F896, 'M', '㣇'),
-    (0x2F897, 'M', '𣊸'),
-    (0x2F898, 'M', '𦇚'),
-    (0x2F899, 'M', 'å½¢'),
-    (0x2F89A, 'M', '彫'),
-    (0x2F89B, 'M', '㣣'),
-    (0x2F89C, 'M', '徚'),
-    (0x2F89D, 'M', 'å¿'),
-    (0x2F89E, 'M', 'å¿—'),
-    (0x2F89F, 'M', '忹'),
-    (0x2F8A0, 'M', 'æ‚'),
-    (0x2F8A1, 'M', '㤺'),
-    (0x2F8A2, 'M', '㤜'),
-    (0x2F8A3, 'M', 'æ‚”'),
-    (0x2F8A4, 'M', '𢛔'),
-    (0x2F8A5, 'M', '惇'),
-    (0x2F8A6, 'M', 'æ…ˆ'),
-    (0x2F8A7, 'M', '慌'),
-    (0x2F8A8, 'M', 'æ…Ž'),
-    (0x2F8A9, 'M', '慌'),
-    (0x2F8AA, 'M', 'æ…º'),
-    (0x2F8AB, 'M', '憎'),
-    (0x2F8AC, 'M', '憲'),
-    (0x2F8AD, 'M', '憤'),
-    (0x2F8AE, 'M', '憯'),
-    (0x2F8AF, 'M', '懞'),
-    (0x2F8B0, 'M', '懲'),
-    (0x2F8B1, 'M', '懶'),
-    (0x2F8B2, 'M', 'æˆ'),
-    (0x2F8B3, 'M', '戛'),
-    (0x2F8B4, 'M', 'æ‰'),
-    (0x2F8B5, 'M', '抱'),
-    (0x2F8B6, 'M', 'æ‹”'),
-    (0x2F8B7, 'M', 'æ'),
-    (0x2F8B8, 'M', '𢬌'),
-    (0x2F8B9, 'M', '挽'),
-    (0x2F8BA, 'M', '拼'),
-    (0x2F8BB, 'M', 'æ¨'),
-    (0x2F8BC, 'M', '掃'),
-    (0x2F8BD, 'M', 'æ¤'),
-    (0x2F8BE, 'M', '𢯱'),
-    (0x2F8BF, 'M', 'æ¢'),
-    (0x2F8C0, 'M', 'æ…'),
-    (0x2F8C1, 'M', '掩'),
-    (0x2F8C2, 'M', '㨮'),
-    (0x2F8C3, 'M', 'æ‘©'),
-    (0x2F8C4, 'M', '摾'),
-    (0x2F8C5, 'M', 'æ’'),
-    (0x2F8C6, 'M', 'æ‘·'),
-    (0x2F8C7, 'M', '㩬'),
-    (0x2F8C8, 'M', 'æ•'),
-    (0x2F8C9, 'M', '敬'),
-    (0x2F8CA, 'M', '𣀊'),
-    (0x2F8CB, 'M', 'æ—£'),
-    (0x2F8CC, 'M', '書'),
-    (0x2F8CD, 'M', '晉'),
-    (0x2F8CE, 'M', '㬙'),
-    (0x2F8CF, 'M', 'æš‘'),
-    (0x2F8D0, 'M', '㬈'),
-    (0x2F8D1, 'M', '㫤'),
-    (0x2F8D2, 'M', '冒'),
-    (0x2F8D3, 'M', '冕'),
-    (0x2F8D4, 'M', '最'),
-    (0x2F8D5, 'M', '暜'),
-    (0x2F8D6, 'M', 'è‚­'),
-    (0x2F8D7, 'M', 'ä™'),
-    (0x2F8D8, 'M', '朗'),
-    (0x2F8D9, 'M', '望'),
-    (0x2F8DA, 'M', '朡'),
-    (0x2F8DB, 'M', 'æž'),
-    (0x2F8DC, 'M', 'æ“'),
-    (0x2F8DD, 'M', 'ð£ƒ'),
-    (0x2F8DE, 'M', 'ã­‰'),
-    (0x2F8DF, 'M', '柺'),
-    (0x2F8E0, 'M', 'æž…'),
-    (0x2F8E1, 'M', 'æ¡’'),
-    (0x2F8E2, 'M', '梅'),
-    (0x2F8E3, 'M', '𣑭'),
-    (0x2F8E4, 'M', '梎'),
-    (0x2F8E5, 'M', 'æ Ÿ'),
-    (0x2F8E6, 'M', '椔'),
-    (0x2F8E7, 'M', 'ã®'),
-    (0x2F8E8, 'M', '楂'),
-    (0x2F8E9, 'M', '榣'),
-    (0x2F8EA, 'M', '槪'),
-    (0x2F8EB, 'M', '檨'),
-    (0x2F8EC, 'M', '𣚣'),
-    (0x2F8ED, 'M', 'æ«›'),
-    (0x2F8EE, 'M', 'ã°˜'),
-    (0x2F8EF, 'M', '次'),
-    (0x2F8F0, 'M', '𣢧'),
-    (0x2F8F1, 'M', 'æ­”'),
-    (0x2F8F2, 'M', '㱎'),
-    (0x2F8F3, 'M', 'æ­²'),
-    (0x2F8F4, 'M', '殟'),
-    (0x2F8F5, 'M', '殺'),
-    (0x2F8F6, 'M', 'æ®»'),
-    (0x2F8F7, 'M', 'ð£ª'),
-    ]
-
-def _seg_78() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
-    return [
-    (0x2F8F8, 'M', 'ð¡´‹'),
-    (0x2F8F9, 'M', '𣫺'),
-    (0x2F8FA, 'M', '汎'),
-    (0x2F8FB, 'M', '𣲼'),
-    (0x2F8FC, 'M', '沿'),
-    (0x2F8FD, 'M', 'æ³'),
-    (0x2F8FE, 'M', 'æ±§'),
-    (0x2F8FF, 'M', 'æ´–'),
-    (0x2F900, 'M', 'æ´¾'),
-    (0x2F901, 'M', 'æµ·'),
-    (0x2F902, 'M', 'æµ'),
-    (0x2F903, 'M', '浩'),
-    (0x2F904, 'M', '浸'),
-    (0x2F905, 'M', 'æ¶…'),
-    (0x2F906, 'M', '𣴞'),
-    (0x2F907, 'M', 'æ´´'),
-    (0x2F908, 'M', '港'),
-    (0x2F909, 'M', 'æ¹®'),
-    (0x2F90A, 'M', 'ã´³'),
-    (0x2F90B, 'M', '滋'),
-    (0x2F90C, 'M', '滇'),
-    (0x2F90D, 'M', '𣻑'),
-    (0x2F90E, 'M', 'æ·¹'),
-    (0x2F90F, 'M', 'æ½®'),
-    (0x2F910, 'M', '𣽞'),
-    (0x2F911, 'M', '𣾎'),
-    (0x2F912, 'M', '濆'),
-    (0x2F913, 'M', '瀹'),
-    (0x2F914, 'M', '瀞'),
-    (0x2F915, 'M', '瀛'),
-    (0x2F916, 'M', 'ã¶–'),
-    (0x2F917, 'M', 'çŠ'),
-    (0x2F918, 'M', 'ç½'),
-    (0x2F919, 'M', 'ç·'),
-    (0x2F91A, 'M', 'ç‚­'),
-    (0x2F91B, 'M', '𠔥'),
-    (0x2F91C, 'M', 'ç……'),
-    (0x2F91D, 'M', '𤉣'),
-    (0x2F91E, 'M', '熜'),
-    (0x2F91F, 'X'),
-    (0x2F920, 'M', '爨'),
-    (0x2F921, 'M', '爵'),
-    (0x2F922, 'M', 'ç‰'),
-    (0x2F923, 'M', '𤘈'),
-    (0x2F924, 'M', '犀'),
-    (0x2F925, 'M', '犕'),
-    (0x2F926, 'M', '𤜵'),
-    (0x2F927, 'M', '𤠔'),
-    (0x2F928, 'M', 'çº'),
-    (0x2F929, 'M', '王'),
-    (0x2F92A, 'M', '㺬'),
-    (0x2F92B, 'M', '玥'),
-    (0x2F92C, 'M', '㺸'),
-    (0x2F92E, 'M', '瑇'),
-    (0x2F92F, 'M', '瑜'),
-    (0x2F930, 'M', '瑱'),
-    (0x2F931, 'M', 'ç’…'),
-    (0x2F932, 'M', '瓊'),
-    (0x2F933, 'M', 'ã¼›'),
-    (0x2F934, 'M', '甤'),
-    (0x2F935, 'M', '𤰶'),
-    (0x2F936, 'M', '甾'),
-    (0x2F937, 'M', '𤲒'),
-    (0x2F938, 'M', 'ç•°'),
-    (0x2F939, 'M', '𢆟'),
-    (0x2F93A, 'M', 'ç˜'),
-    (0x2F93B, 'M', '𤾡'),
-    (0x2F93C, 'M', '𤾸'),
-    (0x2F93D, 'M', 'ð¥„'),
-    (0x2F93E, 'M', '㿼'),
-    (0x2F93F, 'M', '䀈'),
-    (0x2F940, 'M', 'ç›´'),
-    (0x2F941, 'M', '𥃳'),
-    (0x2F942, 'M', '𥃲'),
-    (0x2F943, 'M', '𥄙'),
-    (0x2F944, 'M', '𥄳'),
-    (0x2F945, 'M', '眞'),
-    (0x2F946, 'M', '真'),
-    (0x2F948, 'M', 'çŠ'),
-    (0x2F949, 'M', '䀹'),
-    (0x2F94A, 'M', 'çž‹'),
-    (0x2F94B, 'M', 'ä†'),
-    (0x2F94C, 'M', 'ä‚–'),
-    (0x2F94D, 'M', 'ð¥'),
-    (0x2F94E, 'M', '硎'),
-    (0x2F94F, 'M', '碌'),
-    (0x2F950, 'M', '磌'),
-    (0x2F951, 'M', '䃣'),
-    (0x2F952, 'M', '𥘦'),
-    (0x2F953, 'M', '祖'),
-    (0x2F954, 'M', '𥚚'),
-    (0x2F955, 'M', '𥛅'),
-    (0x2F956, 'M', 'ç¦'),
-    (0x2F957, 'M', 'ç§«'),
-    (0x2F958, 'M', '䄯'),
-    (0x2F959, 'M', 'ç©€'),
-    (0x2F95A, 'M', '穊'),
-    (0x2F95B, 'M', 'ç©'),
-    (0x2F95C, 'M', '𥥼'),
-    (0x2F95D, 'M', '𥪧'),
-    ]
-
-def _seg_79() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
-    return [
-    (0x2F95F, 'X'),
-    (0x2F960, 'M', '䈂'),
-    (0x2F961, 'M', '𥮫'),
-    (0x2F962, 'M', '篆'),
-    (0x2F963, 'M', '築'),
-    (0x2F964, 'M', '䈧'),
-    (0x2F965, 'M', '𥲀'),
-    (0x2F966, 'M', 'ç³’'),
-    (0x2F967, 'M', '䊠'),
-    (0x2F968, 'M', '糨'),
-    (0x2F969, 'M', 'ç³£'),
-    (0x2F96A, 'M', 'ç´€'),
-    (0x2F96B, 'M', '𥾆'),
-    (0x2F96C, 'M', 'çµ£'),
-    (0x2F96D, 'M', 'äŒ'),
-    (0x2F96E, 'M', 'ç·‡'),
-    (0x2F96F, 'M', '縂'),
-    (0x2F970, 'M', 'ç¹…'),
-    (0x2F971, 'M', '䌴'),
-    (0x2F972, 'M', '𦈨'),
-    (0x2F973, 'M', '𦉇'),
-    (0x2F974, 'M', 'ä™'),
-    (0x2F975, 'M', '𦋙'),
-    (0x2F976, 'M', '罺'),
-    (0x2F977, 'M', '𦌾'),
-    (0x2F978, 'M', '羕'),
-    (0x2F979, 'M', '翺'),
-    (0x2F97A, 'M', '者'),
-    (0x2F97B, 'M', '𦓚'),
-    (0x2F97C, 'M', '𦔣'),
-    (0x2F97D, 'M', 'è '),
-    (0x2F97E, 'M', '𦖨'),
-    (0x2F97F, 'M', 'è°'),
-    (0x2F980, 'M', 'ð£Ÿ'),
-    (0x2F981, 'M', 'ä•'),
-    (0x2F982, 'M', '育'),
-    (0x2F983, 'M', '脃'),
-    (0x2F984, 'M', 'ä‹'),
-    (0x2F985, 'M', '脾'),
-    (0x2F986, 'M', '媵'),
-    (0x2F987, 'M', '𦞧'),
-    (0x2F988, 'M', '𦞵'),
-    (0x2F989, 'M', '𣎓'),
-    (0x2F98A, 'M', '𣎜'),
-    (0x2F98B, 'M', 'èˆ'),
-    (0x2F98C, 'M', '舄'),
-    (0x2F98D, 'M', '辞'),
-    (0x2F98E, 'M', 'ä‘«'),
-    (0x2F98F, 'M', '芑'),
-    (0x2F990, 'M', '芋'),
-    (0x2F991, 'M', 'èŠ'),
-    (0x2F992, 'M', '劳'),
-    (0x2F993, 'M', '花'),
-    (0x2F994, 'M', '芳'),
-    (0x2F995, 'M', '芽'),
-    (0x2F996, 'M', '苦'),
-    (0x2F997, 'M', '𦬼'),
-    (0x2F998, 'M', 'è‹¥'),
-    (0x2F999, 'M', 'èŒ'),
-    (0x2F99A, 'M', 'è£'),
-    (0x2F99B, 'M', '莭'),
-    (0x2F99C, 'M', '茣'),
-    (0x2F99D, 'M', '莽'),
-    (0x2F99E, 'M', 'è§'),
-    (0x2F99F, 'M', 'è‘—'),
-    (0x2F9A0, 'M', 'è“'),
-    (0x2F9A1, 'M', 'èŠ'),
-    (0x2F9A2, 'M', 'èŒ'),
-    (0x2F9A3, 'M', 'èœ'),
-    (0x2F9A4, 'M', '𦰶'),
-    (0x2F9A5, 'M', '𦵫'),
-    (0x2F9A6, 'M', '𦳕'),
-    (0x2F9A7, 'M', '䔫'),
-    (0x2F9A8, 'M', '蓱'),
-    (0x2F9A9, 'M', '蓳'),
-    (0x2F9AA, 'M', 'è”–'),
-    (0x2F9AB, 'M', 'ð§Š'),
-    (0x2F9AC, 'M', '蕤'),
-    (0x2F9AD, 'M', '𦼬'),
-    (0x2F9AE, 'M', 'ä•'),
-    (0x2F9AF, 'M', 'ä•¡'),
-    (0x2F9B0, 'M', '𦾱'),
-    (0x2F9B1, 'M', '𧃒'),
-    (0x2F9B2, 'M', 'ä•«'),
-    (0x2F9B3, 'M', 'è™'),
-    (0x2F9B4, 'M', '虜'),
-    (0x2F9B5, 'M', 'è™§'),
-    (0x2F9B6, 'M', '虩'),
-    (0x2F9B7, 'M', 'èš©'),
-    (0x2F9B8, 'M', '蚈'),
-    (0x2F9B9, 'M', '蜎'),
-    (0x2F9BA, 'M', '蛢'),
-    (0x2F9BB, 'M', 'è¹'),
-    (0x2F9BC, 'M', '蜨'),
-    (0x2F9BD, 'M', 'è«'),
-    (0x2F9BE, 'M', '螆'),
-    (0x2F9BF, 'X'),
-    (0x2F9C0, 'M', '蟡'),
-    (0x2F9C1, 'M', 'è '),
-    (0x2F9C2, 'M', 'ä—¹'),
-    ]
-
-def _seg_80() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
-    return [
-    (0x2F9C3, 'M', 'è¡ '),
-    (0x2F9C4, 'M', 'è¡£'),
-    (0x2F9C5, 'M', 'ð§™§'),
-    (0x2F9C6, 'M', '裗'),
-    (0x2F9C7, 'M', '裞'),
-    (0x2F9C8, 'M', '䘵'),
-    (0x2F9C9, 'M', '裺'),
-    (0x2F9CA, 'M', 'ã’»'),
-    (0x2F9CB, 'M', 'ð§¢®'),
-    (0x2F9CC, 'M', '𧥦'),
-    (0x2F9CD, 'M', 'äš¾'),
-    (0x2F9CE, 'M', '䛇'),
-    (0x2F9CF, 'M', '誠'),
-    (0x2F9D0, 'M', 'è«­'),
-    (0x2F9D1, 'M', '變'),
-    (0x2F9D2, 'M', '豕'),
-    (0x2F9D3, 'M', '𧲨'),
-    (0x2F9D4, 'M', '貫'),
-    (0x2F9D5, 'M', 'è³'),
-    (0x2F9D6, 'M', 'è´›'),
-    (0x2F9D7, 'M', 'èµ·'),
-    (0x2F9D8, 'M', '𧼯'),
-    (0x2F9D9, 'M', 'ð  „'),
-    (0x2F9DA, 'M', 'è·‹'),
-    (0x2F9DB, 'M', 'è¶¼'),
-    (0x2F9DC, 'M', 'è·°'),
-    (0x2F9DD, 'M', '𠣞'),
-    (0x2F9DE, 'M', 'è»”'),
-    (0x2F9DF, 'M', '輸'),
-    (0x2F9E0, 'M', '𨗒'),
-    (0x2F9E1, 'M', '𨗭'),
-    (0x2F9E2, 'M', 'é‚”'),
-    (0x2F9E3, 'M', '郱'),
-    (0x2F9E4, 'M', 'é„‘'),
-    (0x2F9E5, 'M', '𨜮'),
-    (0x2F9E6, 'M', 'é„›'),
-    (0x2F9E7, 'M', '鈸'),
-    (0x2F9E8, 'M', 'é‹—'),
-    (0x2F9E9, 'M', '鋘'),
-    (0x2F9EA, 'M', '鉼'),
-    (0x2F9EB, 'M', 'é¹'),
-    (0x2F9EC, 'M', 'é•'),
-    (0x2F9ED, 'M', '𨯺'),
-    (0x2F9EE, 'M', 'é–‹'),
-    (0x2F9EF, 'M', '䦕'),
-    (0x2F9F0, 'M', 'é–·'),
-    (0x2F9F1, 'M', '𨵷'),
-    (0x2F9F2, 'M', '䧦'),
-    (0x2F9F3, 'M', '雃'),
-    (0x2F9F4, 'M', 'å¶²'),
-    (0x2F9F5, 'M', '霣'),
-    (0x2F9F6, 'M', 'ð©……'),
-    (0x2F9F7, 'M', '𩈚'),
-    (0x2F9F8, 'M', 'ä©®'),
-    (0x2F9F9, 'M', 'ä©¶'),
-    (0x2F9FA, 'M', '韠'),
-    (0x2F9FB, 'M', 'ð©Š'),
-    (0x2F9FC, 'M', '䪲'),
-    (0x2F9FD, 'M', 'ð©’–'),
-    (0x2F9FE, 'M', 'é ‹'),
-    (0x2FA00, 'M', 'é ©'),
-    (0x2FA01, 'M', 'ð©–¶'),
-    (0x2FA02, 'M', '飢'),
-    (0x2FA03, 'M', '䬳'),
-    (0x2FA04, 'M', '餩'),
-    (0x2FA05, 'M', '馧'),
-    (0x2FA06, 'M', 'é§‚'),
-    (0x2FA07, 'M', 'é§¾'),
-    (0x2FA08, 'M', '䯎'),
-    (0x2FA09, 'M', '𩬰'),
-    (0x2FA0A, 'M', '鬒'),
-    (0x2FA0B, 'M', 'é±€'),
-    (0x2FA0C, 'M', 'é³½'),
-    (0x2FA0D, 'M', '䳎'),
-    (0x2FA0E, 'M', 'ä³­'),
-    (0x2FA0F, 'M', 'éµ§'),
-    (0x2FA10, 'M', '𪃎'),
-    (0x2FA11, 'M', '䳸'),
-    (0x2FA12, 'M', '𪄅'),
-    (0x2FA13, 'M', '𪈎'),
-    (0x2FA14, 'M', '𪊑'),
-    (0x2FA15, 'M', '麻'),
-    (0x2FA16, 'M', 'äµ–'),
-    (0x2FA17, 'M', '黹'),
-    (0x2FA18, 'M', '黾'),
-    (0x2FA19, 'M', 'é¼…'),
-    (0x2FA1A, 'M', 'é¼'),
-    (0x2FA1B, 'M', 'é¼–'),
-    (0x2FA1C, 'M', 'é¼»'),
-    (0x2FA1D, 'M', '𪘀'),
-    (0x2FA1E, 'X'),
-    (0x30000, 'V'),
-    (0x3134B, 'X'),
-    (0xE0100, 'I'),
-    (0xE01F0, 'X'),
-    ]
-
-uts46data = tuple(
-    _seg_0()
-    + _seg_1()
-    + _seg_2()
-    + _seg_3()
-    + _seg_4()
-    + _seg_5()
-    + _seg_6()
-    + _seg_7()
-    + _seg_8()
-    + _seg_9()
-    + _seg_10()
-    + _seg_11()
-    + _seg_12()
-    + _seg_13()
-    + _seg_14()
-    + _seg_15()
-    + _seg_16()
-    + _seg_17()
-    + _seg_18()
-    + _seg_19()
-    + _seg_20()
-    + _seg_21()
-    + _seg_22()
-    + _seg_23()
-    + _seg_24()
-    + _seg_25()
-    + _seg_26()
-    + _seg_27()
-    + _seg_28()
-    + _seg_29()
-    + _seg_30()
-    + _seg_31()
-    + _seg_32()
-    + _seg_33()
-    + _seg_34()
-    + _seg_35()
-    + _seg_36()
-    + _seg_37()
-    + _seg_38()
-    + _seg_39()
-    + _seg_40()
-    + _seg_41()
-    + _seg_42()
-    + _seg_43()
-    + _seg_44()
-    + _seg_45()
-    + _seg_46()
-    + _seg_47()
-    + _seg_48()
-    + _seg_49()
-    + _seg_50()
-    + _seg_51()
-    + _seg_52()
-    + _seg_53()
-    + _seg_54()
-    + _seg_55()
-    + _seg_56()
-    + _seg_57()
-    + _seg_58()
-    + _seg_59()
-    + _seg_60()
-    + _seg_61()
-    + _seg_62()
-    + _seg_63()
-    + _seg_64()
-    + _seg_65()
-    + _seg_66()
-    + _seg_67()
-    + _seg_68()
-    + _seg_69()
-    + _seg_70()
-    + _seg_71()
-    + _seg_72()
-    + _seg_73()
-    + _seg_74()
-    + _seg_75()
-    + _seg_76()
-    + _seg_77()
-    + _seg_78()
-    + _seg_79()
-    + _seg_80()
-)  # type: Tuple[Union[Tuple[int, str], Tuple[int, str, str]], ...]
diff --git a/lib/sub_repos/idna/setup.py b/lib/sub_repos/idna/setup.py
deleted file mode 100644
index dffa23d7b..000000000
--- a/lib/sub_repos/idna/setup.py
+++ /dev/null
@@ -1,62 +0,0 @@
-"""
-A library to support the Internationalised Domain Names in Applications
-(IDNA) protocol as specified in RFC 5890 et.al. This new methodology,
-known as IDNA 2008, can generate materially different results to the
-previous standard. The library can act as a drop-in replacement for
-the "encodings.idna" module.
-"""
-
-import io, sys
-from setuptools import setup
-
-
-def main():
-
-    python_version = sys.version_info[:2]
-    if python_version < (3,4):
-        raise SystemExit("Sorry, Python 3.4 or newer required")
-
-    package_data = {}
-    exec(open('idna/package_data.py').read(), package_data)
-
-    arguments = {
-        'name': 'idna',
-        'packages': ['idna'],
-        'package_data': {'idna': ['py.typed']},
-        'include_package_data': True,
-        'version': package_data['__version__'],
-        'description': 'Internationalized Domain Names in Applications (IDNA)',
-        'long_description': open("README.rst", encoding="UTF-8").read(),
-        'author': 'Kim Davies',
-        'author_email': 'kim@cynosure.com.au',
-        'license': 'BSD-3-Clause',
-        'url': 'https://github.com/kjd/idna',
-        'classifiers': [
-            'Development Status :: 5 - Production/Stable',
-            'Intended Audience :: Developers',
-            'Intended Audience :: System Administrators',
-            'License :: OSI Approved :: BSD License',
-            'Operating System :: OS Independent',
-            'Programming Language :: Python',
-            'Programming Language :: Python :: 3',
-            'Programming Language :: Python :: 3 :: Only',
-            'Programming Language :: Python :: 3.5',
-            'Programming Language :: Python :: 3.6',
-            'Programming Language :: Python :: 3.7',
-            'Programming Language :: Python :: 3.8',
-            'Programming Language :: Python :: 3.9',
-            'Programming Language :: Python :: 3.10',
-            'Programming Language :: Python :: Implementation :: CPython',
-            'Programming Language :: Python :: Implementation :: PyPy',
-            'Topic :: Internet :: Name Service (DNS)',
-            'Topic :: Software Development :: Libraries :: Python Modules',
-            'Topic :: Utilities',
-        ],
-        'python_requires': '>=3.5',
-        'test_suite': 'tests',
-    }
-
-    setup(**arguments)
-
-if __name__ == '__main__':
-    main()
diff --git a/lib/sub_repos/idna/tools/idna-data b/lib/sub_repos/idna/tools/idna-data
deleted file mode 100755
index f5572a8e9..000000000
--- a/lib/sub_repos/idna/tools/idna-data
+++ /dev/null
@@ -1,671 +0,0 @@
-#!/usr/bin/env python3
-
-import argparse, collections, datetime, os, re, sys, unicodedata
-from urllib.request import urlopen
-from intranges import intranges_from_list
-
-if sys.version_info[0] < 3:
-    print("Only Python 3 supported.")
-    sys.exit(2)
-
-PREFERRED_VERSION = '14.0.0'
-UCD_URL = 'http://www.unicode.org/Public/{version}/ucd/{filename}'
-UTS46_URL = 'http://www.unicode.org/Public/idna/{version}/{filename}'
-
-DEFAULT_CACHE_DIR = '~/.cache/unidata'
-
-# Scripts affected by IDNA contextual rules
-SCRIPT_WHITELIST = sorted(['Greek', 'Han', 'Hebrew', 'Hiragana', 'Katakana'])
-
-# Used to piece apart UTS#46 data for Jython compatibility
-UTS46_SEGMENT_SIZE = 100
-
-UTS46_STATUSES = {
-    'valid': ('V', False),
-    'ignored': ('I', False),
-    'mapped': ('M', True),
-    'deviation': ('D', True),
-    'disallowed': ('X', False),
-    'disallowed_STD3_valid': ('3', False),
-    'disallowed_STD3_mapped': ('3', True)
-}
-
-# Exceptions are manually assigned in Section 2.6 of RFC 5892.
-exceptions = {
-    0x00DF: 'PVALID',      # LATIN SMALL LETTER SHARP S
-    0x03C2: 'PVALID',      # GREEK SMALL LETTER FINAL SIGMA
-    0x06FD: 'PVALID',      # ARABIC SIGN SINDHI AMPERSAND
-    0x06FE: 'PVALID',      # ARABIC SIGN SINDHI POSTPOSITION MEN
-    0x0F0B: 'PVALID',      # TIBETAN MARK INTERSYLLABIC TSHEG
-    0x3007: 'PVALID',      # IDEOGRAPHIC NUMBER ZERO
-    0x00B7: 'CONTEXTO',    # MIDDLE DOT
-    0x0375: 'CONTEXTO',    # GREEK LOWER NUMERAL SIGN (KERAIA)
-    0x05F3: 'CONTEXTO',    # HEBREW PUNCTUATION GERESH
-    0x05F4: 'CONTEXTO',    # HEBREW PUNCTUATION GERSHAYIM
-    0x30FB: 'CONTEXTO',    # KATAKANA MIDDLE DOT
-    0x0660: 'CONTEXTO',    # ARABIC-INDIC DIGIT ZERO
-    0x0661: 'CONTEXTO',    # ARABIC-INDIC DIGIT ONE
-    0x0662: 'CONTEXTO',    # ARABIC-INDIC DIGIT TWO
-    0x0663: 'CONTEXTO',    # ARABIC-INDIC DIGIT THREE
-    0x0664: 'CONTEXTO',    # ARABIC-INDIC DIGIT FOUR
-    0x0665: 'CONTEXTO',    # ARABIC-INDIC DIGIT FIVE
-    0x0666: 'CONTEXTO',    # ARABIC-INDIC DIGIT SIX
-    0x0667: 'CONTEXTO',    # ARABIC-INDIC DIGIT SEVEN
-    0x0668: 'CONTEXTO',    # ARABIC-INDIC DIGIT EIGHT
-    0x0669: 'CONTEXTO',    # ARABIC-INDIC DIGIT NINE
-    0x06F0: 'CONTEXTO',    # EXTENDED ARABIC-INDIC DIGIT ZERO
-    0x06F1: 'CONTEXTO',    # EXTENDED ARABIC-INDIC DIGIT ONE
-    0x06F2: 'CONTEXTO',    # EXTENDED ARABIC-INDIC DIGIT TWO
-    0x06F3: 'CONTEXTO',    # EXTENDED ARABIC-INDIC DIGIT THREE
-    0x06F4: 'CONTEXTO',    # EXTENDED ARABIC-INDIC DIGIT FOUR
-    0x06F5: 'CONTEXTO',    # EXTENDED ARABIC-INDIC DIGIT FIVE
-    0x06F6: 'CONTEXTO',    # EXTENDED ARABIC-INDIC DIGIT SIX
-    0x06F7: 'CONTEXTO',    # EXTENDED ARABIC-INDIC DIGIT SEVEN
-    0x06F8: 'CONTEXTO',    # EXTENDED ARABIC-INDIC DIGIT EIGHT
-    0x06F9: 'CONTEXTO',    # EXTENDED ARABIC-INDIC DIGIT NINE
-    0x0640: 'DISALLOWED',  # ARABIC TATWEEL
-    0x07FA: 'DISALLOWED',  # NKO LAJANYALAN
-    0x302E: 'DISALLOWED',  # HANGUL SINGLE DOT TONE MARK
-    0x302F: 'DISALLOWED',  # HANGUL DOUBLE DOT TONE MARK
-    0x3031: 'DISALLOWED',  # VERTICAL KANA REPEAT MARK
-    0x3032: 'DISALLOWED',  # VERTICAL KANA REPEAT WITH VOICED SOUND MARK
-    0x3033: 'DISALLOWED',  # VERTICAL KANA REPEAT MARK UPPER HALF
-    0x3034: 'DISALLOWED',  # VERTICAL KANA REPEAT WITH VOICED SOUND MARK UPPER HA
-    0x3035: 'DISALLOWED',  # VERTICAL KANA REPEAT MARK LOWER HALF
-    0x303B: 'DISALLOWED',  # VERTICAL IDEOGRAPHIC ITERATION MARK
-}
-backwardscompatible = {}
-
-
-def hexrange(start, end):
-    return range(int(start, 16), int(end, 16) + 1)
-
-def hexvalue(value):
-    return int(value, 16)
-
-
-class UnicodeVersion(object):
-
-    def __init__(self, version):
-        result = re.match(r'^(?P\d+)\.(?P\d+)\.(?P\d+)$', version)
-        if result:
-            self.major = int(result.group('major'))
-            self.minor = int(result.group('minor'))
-            self.patch = int(result.group('patch'))
-            self.numerical = (self.major << 8) + (self.minor << 4) + self.patch
-            self.latest = False
-        elif version == 'latest':
-            self.latest = True
-        else:
-            raise ValueError('Unrecognized Unicode version')
-
-    def __repr__(self, with_date=True):
-        if self.latest:
-            if with_date:
-                return 'latest@{}'.format(datetime.datetime.now().strftime('%Y-%m-%d'))
-            else:
-                return 'latest'
-        else:
-            return '{}.{}.{}'.format(self.major, self.minor, self.patch)
-
-    @property
-    def tag(self):
-        return self.__repr__(with_date=False)
-
-    def __gt__(self, other):
-        if self.latest:
-            return True
-        return self.numerical > other.numerical
-
-    def __eq__(self, other):
-        if self.latest:
-            return False
-        return self.numerical == other.numerical
-
-
-class UnicodeData(object):
-
-    def __init__(self, version, cache, args):
-        self.version = UnicodeVersion(version)
-        self.system_version = UnicodeVersion(unicodedata.unidata_version)
-        self.source = args.source
-        self.cache = cache
-        self.max = 0
-
-        if self.system_version < self.version:
-            print('Warning: Character stability not guaranteed as Python Unicode data {}'
-                   ' older than requested {}'.format(self.system_version, self.version))
-
-        self._load_unicodedata()
-        self._load_proplist()
-        self._load_derivedcoreprops()
-        self._load_blocks()
-        self._load_casefolding()
-        self._load_hangulst()
-        self._load_arabicshaping()
-        self._load_scripts()
-        self._load_uts46mapping()
-
-    def _load_unicodedata(self):
-
-        f_ud = self._ucdfile('UnicodeData.txt')
-        self.ucd_data = {}
-        range_begin = None
-        for line in f_ud.splitlines():
-            fields = line.split(';')
-            value = int(fields[0], 16)
-            start_marker = re.match('^<(?P.*?), First>$', fields[1])
-            end_marker = re.match('^<(?P.*?), Last>$', fields[1])
-            if start_marker:
-                range_begin = value
-            elif end_marker:
-                for i in range(range_begin, value+1):
-                    fields[1] = '<{}>'.format(end_marker.group('name'))
-                    self.ucd_data[i] = fields[1:]
-                range_begin = None
-            else:
-                self.ucd_data[value] = fields[1:]
-
-    def _load_proplist(self):
-
-        f_pl = self._ucdfile('PropList.txt')
-        self.ucd_props = collections.defaultdict(list)
-        for line in f_pl.splitlines():
-            result = re.match(
-                r'^(?P[0-9A-F]{4,6})(|\.\.(?P[0-9A-F]{4,6}))\s*;\s*(?P\S+)\s*(|\#.*)$',
-                line)
-            if result:
-                if result.group('end'):
-                    for i in hexrange(result.group('start'), result.group('end')):
-                        self.ucd_props[i].append(result.group('prop'))
-                else:
-                    i = hexvalue(result.group('start'))
-                    self.ucd_props[i].append(result.group('prop'))
-
-    def _load_derivedcoreprops(self):
-
-        f_dcp = self._ucdfile('DerivedCoreProperties.txt')
-        for line in f_dcp.splitlines():
-            result = re.match(
-                r'^(?P[0-9A-F]{4,6})(|\.\.(?P[0-9A-F]{4,6}))\s*;\s*(?P\S+)\s*(|\#.*)$',
-                line)
-            if result:
-                if result.group('end'):
-                    for i in hexrange(result.group('start'), result.group('end')):
-                        self.ucd_props[i].append(result.group('prop'))
-                else:
-                    i = hexvalue(result.group('start'))
-                    self.ucd_props[i].append(result.group('prop'))
-
-    def _load_blocks(self):
-
-        self.ucd_block = {}
-        f_b = self._ucdfile('Blocks.txt')
-        for line in f_b.splitlines():
-            result = re.match(
-                r'^(?P[0-9A-F]{4,6})\.\.(?P[0-9A-F]{4,6})\s*;\s*(?P.*)\s*$',
-                line)
-            if result:
-                for i in hexrange(result.group('start'), result.group('end')):
-                    self.ucd_block[i] = result.group('block')
-                    self.max = max(self.max, i)
-
-    def _load_casefolding(self):
-
-        self.ucd_cf = {}
-        f_cf = self._ucdfile('CaseFolding.txt')
-        for line in f_cf.splitlines():
-            result = re.match(
-                r'^(?P[0-9A-F]{4,6})\s*;\s*(?P\S+)\s*;\s*(?P[0-9A-F\s]+)\s*',
-                line)
-            if result:
-                if result.group('type') in ('C', 'F'):
-                    self.ucd_cf[int(result.group('cp'), 16)] = \
-                        ''.join([chr(int(x, 16)) for x in result.group('subst').split(' ')])
-
-    def _load_hangulst(self):
-
-        self.ucd_hst = {}
-        f_hst = self._ucdfile('HangulSyllableType.txt')
-        for line in f_hst.splitlines():
-            result = re.match(
-                r'^(?P[0-9A-F]{4,6})\.\.(?P[0-9A-F]{4,6})\s*;\s*(?P\S+)\s*(|\#.*)$',
-                line)
-            if result:
-                for i in hexrange(result.group('start'), result.group('end')):
-                    self.ucd_hst[i] = result.group('type')
-
-    def _load_arabicshaping(self):
-
-        self.ucd_as = {}
-        f_as = self._ucdfile('ArabicShaping.txt')
-        for line in f_as.splitlines():
-            result = re.match(r'^(?P[0-9A-F]{4,6})\s*;\s*.*?\s*;\s*(?P\S+)\s*;', line)
-            if result:
-                self.ucd_as[int(result.group('cp'), 16)] = result.group('jt')
-
-    def _load_scripts(self):
-
-        self.ucd_s = {}
-        f_s = self._ucdfile('Scripts.txt')
-        for line in f_s.splitlines():
-            result = re.match(
-                r'^(?P[0-9A-F]{4,6})(|\.\.(?P[0-9A-F]{4,6}))\s*;\s*(?P